我正在使用Spring和SpringMvc,我想在某个控制器中调用服务的方法,并且它们都是 由Spring管理。当我尝试这样做时,我得到了NullPointerException,但是在调用此方法之前,我发现Service的构造函数真正被调用了。 我想也许这个服务已经在Spring中添加了,但是这个控制器中的属性还没有设置。
如何从SpringContext获取它?
我的代码是这样的:
@Controller
@RequestMapping("/test")
public class SomeController {
@Resource
private SomeService someService;
{
someService.serviceMethod();
//And something more
}
@RequestMapping("/someMethod")
private void controllerMethod(){
}
}
答案 0 :(得分:2)
您正尝试从初始化程序块调用弹簧注入服务。使用@Resource注释的资源尚未被Spring注入控制器!这就是你获得NullPointerException的原因 创建一个单独的函数,用@PostConstruct注释。
@Controller
@RequestMapping("/test")
public class SomeController {
@Resource
private SomeService someService;
@PostConstruct
public void postConstruct(){
someService.serviceMethod();
}
}
" postConstruct"在创建bean(即控制器)并将所有依赖项(包括SomeService)注入bean之后,将调用该方法。当然,它满足了你只需要调用一次的要求。
答案 1 :(得分:0)
您的具体问题与Java处理CreateController
:
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
如果您想坚持使用初始化程序块,可以通过向控制器添加构造函数并将服务注入其中来解决问题:
@PostConstruct
public void setupSomeController(){
someService.serviceMethod();
}
或者,您可以移除初始化程序块并添加Instance Initalizer Blocks带注释的设置方法。
{{1}}