2014-11-09 3 views
0

Это контроллер, который вызывает thread 'TestRunner'.Spring autowire предоставляет nullPointerException

@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. Эта услуга autowired, но я все еще получаю исключение нулевого указателя, когда я звоню 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» с «новым»?

+0

_Is это из-за того, что я создаю объект TestRunner с «новым»? _ Да. Почему вы не позволили Spring создать контроллер? – Reimeus

+0

как autowiring TestRunner внутри HomeController? но я хочу передать параметры конструктору TestRunner. – user1298426

+0

Самый простой способ решить это - сделать TestRunner * create * и вернуть Runnable, из a, b и c, переданных как аргументы в метод, а не TestRunner *, являющийся * Runnable. И он не должен быть аннотирован с помощью '@ Controller', поскольку он не является контроллером вообще. Вместо этого используйте '@ Component'. –

ответ

0

Это из-за того, что я создаю объект «TestRunner» с «новым»?

Да, это из-за этого вы получаете NullpointerExceptoin.

Чтобы исправить этот вопрос изменить следующим образом:

  1. Марк следующие три класса A, B, C в качестве компонента - если не уже сделано. Убедитесь, что пакет в компоненте пути сканирования:

    @Component
    общественного класса А {

    @Component
    общественного класса B {

    @Component
    общественного класса С {

  2. Затем Autowire экземпляры A, B, C в TestRunner. Также изменить аннотацию TestRunner к @Component

    @Component общественного класса TestRunner реализует Runnable { @Autowired частный A A;

    @Autowired 
    private B b; 
    
    @Autowired 
    private C c; 
    
  3. В HomeRunner создать поле экземпляра для TestRunner и autowire его. Удалите код instansiation с новым оператором для TestRunner.

+0

Я получил вашу мысль, но A, B, C - ПОЖО. Я устанавливаю свои поля в HomeController и передавая эти объекты в TestRunner. Как я смогу передать эти объекты в TestRunner? – user1298426