Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Kotlin中使用可为空的“beanName”实现BeanPostProcessor?_Java_Spring_Kotlin - Fatal编程技术网

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

Java 如何在Kotlin中使用可为空的“beanName”实现BeanPostProcessor?,java,spring,kotlin,Java,Spring,Kotlin,问题是我需要使beanName为空。例如,由于springpassnull的某些部分而不是有效的bean名称Quartz。同样的Java实现也可以正常工作 我尝试添加JetBrain的@Nullable注释。它不起作用。反编译的类似乎是。此外,我在项目文件夹中用不同的名称制作了BeanPostProcessor的完整克隆,在kotlin上实现了beanName,并且使beanName可以为空,没有任何错误 //Java package org.myapp; import org.springf

问题是我需要使beanName为空。例如,由于springpassnull的某些部分而不是有效的bean名称Quartz。同样的Java实现也可以正常工作

我尝试添加JetBrain的@Nullable注释。它不起作用。反编译的类似乎是。此外,我在项目文件夹中用不同的名称制作了BeanPostProcessor的完整克隆,在kotlin上实现了beanName,并且使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? {...}
科特林问题的例子如下。这里我得到了一个“postProcessAfterInitialization”,如果我添加它,它不会覆盖任何内容?要创建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 {...}
现在我们使用SpringBootVersion2.0.6。在2.1.x版本中,问题不会重现。然而,我想弄清楚这个问题。这是我知识上的一个缺口还是一个bug,我应该报告它

UPD:
正如Eugene所说,问题在于Spring5.x中引入的包级别的非空API声明。通过将spring引导版本升级到2.1.xat,至少解决了quartz自动配置问题

Spring使用包范围的注释来声明除非明确指定,否则所有参数都不可为null

您可以在中间添加一个微小的java抽象类,并用@ null注释标记所有的参数。从该类型继承应该适用于您的案例