【问题标题】:Getting Null on Autowired Class when calling from other class [duplicate]从其他类调用时在自动装配类上获取 Null [重复]
【发布时间】:2019-01-30 00:23:03
【问题描述】:

Test.java

@Service
public class Test {

public void Testing() {
    System.out.println("inside testing");
}
}

这是我的工厂类

@Service
 public class ClaimFactory extends BaseClaimFactory {

   @Autowired
   ClaimProvider claimProvider;

@Override
public ClaimProvider getClaimRequest( String type) throws Exception {

    if (type.equals(ClaimProviderEnums.ABC.toString())) {

         claimProvider = new ABCIMP();
    }

    return claimProvider;
}

}

这是我的 ABCIMP.java 类

@Service
public class ABCIMP implements ClaimProvider {

@Autowired
Test test;

public void claimRequest(){
      test.testing();
   }

}

我是这样打电话的

     claimProviders=baseClaimFactory.getClaimRequest();
     claimProviders.claimRequest();

我不知道为什么我在test.testing() 线上得到 java.lang.NullPointerException 有人知道为什么会发生这种情况并且当我打电话时它正在工作 aBCIMP.claimRequest()

【问题讨论】:

  • 不是ABCIMP Component,而不是Service。我也会为你的Test 班级问同样的问题。
  • 因为它是一个服务层 ABCIMP.java。 ..即使组件不工作
  • 是的,当您不让 IOC 容器为您代理对象时,它将不起作用。你不能做 new X() 并期望 Spring 为你管理它。
  • 当我在 getClaimRequest 中返回 Autowire ABCIMP aBCIMP; 并像 return aBCIMP 一样返回它,然后我在 `claimProviders.claimRequest();` 处得到空指针;`

标签: java spring spring-mvc spring-boot


【解决方案1】:

您已经使用new ABCIMP(); 创建了ABCIMP 实例。除非您配置了 AspectJ Proxies,否则 Spring Framework 不会处理使用 Java new 运算符创建的对象。

不要创建新实例,仅使用@Autowired 从 Spring 上下文中获取现有实例。完全删除 ClaimFactory 类,您正在重复 Spring 的工作。如果需要在运行时获取实例:

@Autowired
private ApplicationContext ctx;

...

if (type.equals(ClaimProviderEnums.ABC.toString())) {
     return ctx.getBean(ABCIMP.class);
}

【讨论】:

  • 所以代替claimProvider = new ABCIMP()我应该使用什么
  • @GauravSingh 阅读了 Spring 自动装配并了解其工作原理:按类型、按名称或与其他分类器一起使用。 ClaimFactory 在您的示例中似乎不需要,Spring DI 是所有 bean 的工厂。
  • 当像return ctx.getBean(ABCIMP.class);一样返回时,我在同一行得到空指针
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2019-03-24
  • 2013-01-12
  • 2021-04-06
  • 1970-01-01
  • 2020-12-03
相关资源
最近更新 更多