【问题标题】:@Lookup not working - throws null pointer exception@Lookup 不工作 - 抛出空指针异常
【发布时间】:2019-10-21 12:38:57
【问题描述】:

我正在尝试检查 bean 范围,这是一个注入单例 bean 的原型。当我使用@Lookup 注释时,它会抛出空指针异常。

singletonBean 类的空指针...实际上返回的 null 应该被 cglib 覆盖并且应该返回原型作用域的 bean 正确...

AppConfiguration.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import Bean.ProtoBean;
import Bean.SingletonBean;

@Configuration
 public class AppConfiguration {

@Bean
@Scope("prototype")
public ProtoBean protoBean() {
    return new ProtoBean();
}

@Bean
@Scope("singleton")
public SingletonBean singletonBean() {
    return new SingletonBean();
}

}

SingletonBean.java

@Component
public class SingletonBean {

public SingletonBean() {
    System.out.println("SingletonBean");
}

public ProtoBean fromProto() {
    ProtoBean protoBean = getProtoBean();
//throws nullpointer here
    System.out.println("beans is here: "+protoBean.hashCode());
    return protoBean;
}

@Lookup
public ProtoBean getProtoBean() {
    return null;
}

}

App.java

public class App 
{
 public static void main( String[] args )
{
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfiguration.class);
    SingletonBean sb = ctx.getBean(SingletonBean.class);
    ProtoBean pb = sb.fromProto();

    SingletonBean sb1 = ctx.getBean(SingletonBean.class);
    ProtoBean pb1 = sb1.fromProto();

    if(pb.equals(pb1)) {
        System.out.println("Equal Proto");
    } else {
        System.out.println("Unequal Proto");
    }

    ctx.close();


}
}

【问题讨论】:

  • 好吧,您调用 getProto() 方法,当您查看当前实现时,该方法总是返回 null。所以在下一行当你调用 protoBean.hashCode 你实际上 cvall null.getHashCode 抛出一个空指针异常
  • @meaningqo,不,这不是那么天真。 (S)他试图让 Spring 覆盖返回 null 的 (baeldung.com/spring-lookup),这通常可以工作,但在某些情况下它是有问题的,请参阅我的回答。

标签: spring-boot


【解决方案1】:

我曾经用这种方法做同样的事情,然后,由于某种未知的原因它停止工作,产生了同样的 NPE 问题。我相信 Spring 在用 GCLIB 编译的实现替换您自己的实现方面存在问题。

最后,我使用了factory method approach,即客户端bean 具有Spring 应用程序上下文并使用它返回getProtoBean() 中所需的依赖项。这不像使用@Lookup 那样简单,但似乎更可靠。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2020-08-10
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多