如何在 Kotlin 中使用可为空的“beanName”实现 BeanPostProcessor?

问题是我需要使为beanName空。由于 spring pass 的某些部分null而不是有效的 bean 名称(例如 Quartz)。Java 上的相同实现可以正常工作。


我尝试添加 JetBrain 的@Nullable注释。它不起作用。而且反编译的类看起来很奇怪。此外,我BeanPostProcessor用不同的名称对项目文件夹进行了完整克隆,在 kotlin 上进行了实现,并且可以为beanName空而没有任何错误。


//Java

package org.myapp;


import org.springframework.beans.BeansException;

import org.springframework.lang.Nullable;


// My clone of BeanPostProcessor

public interface CloneOfBeanPostProcessor {


    @Nullable

        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

            return bean;

        }


    @Nullable

    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

        return bean;

    }

}


// Kotlin

package org.myapp


import org.myapp.CloneOfBeanPostProcessor

import org.springframework.stereotype.Component



@Component

class MessageSourceBeanPostProcessorOld : CloneOfBeanPostProcessor {

    // Have no warnings in this case.

    override fun postProcessAfterInitialization(bean: Any, beanName: String?): Any? {...}

下面的 Kotlin 问题示例。'postProcessAfterInitialization' overrides nothing如果我添加?到 beanName 类型,我在这里得到一个:


@Component

class MessageSourceBeanPostProcessorOld : BeanPostProcessor {

    override fun postProcessAfterInitialization(bean: Any, beanName: String?): Any? {...}

Java 上的相同代码运行良好:


@Component

class MessageSourceBeanPostProcessor implements BeanPostProcessor {

    @Override

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {...}

现在我们使用 spring-boot 版本 2.0.6。在 2.1.x 版本中问题不会重现。但是,我想弄清楚这个问题。这是我的知识差距还是错误,我应该报告吗?


UPD:正如 Eugene 所说,问题出在 spring 5.x 中引入的包级别的非空 API 声明中。通过将 spring-boot 版本升级到 2.1.x 解决了问题(至少对于石英自动配置问题)。


largeQ
浏览 207回答 1
1回答

互换的青春

Spring 使用包范围的注解来声明所有参数(除非明确指定)都是不可为空的。您可以在中间添加一个很小的 Java 抽象类,并用@Nullable注释清楚地标记所有参数。从该类型继承应该适用于您的情况
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java