Spring autowire给出了nullPointerException

时间:2014-11-09 14:55:50

标签: java spring autowired

这是调用线程' TestRunner'。

的控制器
@Controller
@RequestMapping("/welcome")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView addCustomerPage() throws Exception{
        ModelAndView modelAndView = new ModelAndView("customer/add-customer-form");

        A a = new A();
        B b = new B();
        C c = new C();

        TestRunner runner = new TestRunner(a, b, c); 
        Thread t = new Thread(runner);
        t.start();
        return modelAndView;
    }

}

这是我调用服务HomeService的线程。此服务是自动装配的,但在我调用homeService.testMeth(a,b,c);

时仍然会出现空指针异常
@Controller
public class TestRunner implements Runnable{

    private A a;
    private B b;
    private C c;

    @Autowired
    private HomeService homeService;



    public TestRunner() {
        super();
        // TODO Auto-generated constructor stub
    }

    public TestRunner(A a, B b, C c){
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public void run() {
        // TODO Auto-generated method stub
        homeService.testMeth(a,b,c);
    }

}

这是服务类。

@Service
public class HomeService {

    public void testMeth(A a, B b, C c){
        System.out.println("inside....");
    }
}

这是因为我正在创建' TestRunner'对象' new' ?

1 个答案:

答案 0 :(得分:0)

  

这是因为我正在用'new'创建'TestRunner'对象吗?

是的,正因为如此,你得到了NullpointerExceptoin。

要解决此问题,请更改以下内容:

  1. 将以下三个类别A,B,C标记为组件 - 如果不是 已经完成了。确保包在组件扫描路径中:

    @Component
    公共等级A {

    @Component
    公共等级B {

    @Component
    公共课C {

  2. 然后在TestRunner中自动装配A,B,C实例。还要将TestRunner的注释更改为@Component

    @Component 公共类TestRunner实现Runnable {     @Autowired     私人A a;

    @Autowired
    private B b;
    
    @Autowired
    private C c;
    
  3. 在HomeRunner中为TestRunner创建一个实例字段并自动装配它。使用TestRunner的新运算符删除实例代码。