我正在处理包含很少子模块的应用程序。在其中一个模块上,我有这样的标题服务:
@Transactional
@Service("mySimpleService")
public class MySimpleServiceImpl implements MySimpleService {}
在另一个模块上,我有一个控制器,我想在其中使用MySimpleService方法之一。所以我有类似的东西:
@Controller
public class EasyController {
@Autowired
private MySimpleService mySimpleService;
@RequestMapping("/webpage.htm")
public ModelAndView webpage(@RequestParam,
@RequestParam,
HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mav = new ModelAndView(”webpage”);
mav.addObject(”name”, mySimpleService.getObject());
return mav;
}
}
我在mav.addObject(”name”, mySimpleService.getObject());
行NullPointerException
。我不知道为什么。我没有收到与Could not autowire field
类似但只有NullPointerException
的错误。
我也以这种方式创建了自己的拦截器来检查我的任务中的其他一些想法:
public class CustomInterceptor extends HandlerInterceptorAdapter {
@Autowired
private MySimpleService mySimpleService;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception {
request.setAttribute("attr", mySimpleService.getAttribute());
return true;
}
}
这个拦截器当然是在调度程序servlet中声明的。在我的日志中,我可以在第NullPointerException
行看到request.setAttribute("attr", mySimpleService.getAttribute());
。所以这是从另一个应用程序模块访问服务的问题。
我怎样才能做到这一点?
我听说过像使用我的服务构建EJB并使用JNDI
或使用Maven一样的想法 - 在构建应用程序期间使用我的服务将文件夹复制到目标模块。我试图做第二种选择,但它没有工作,我无法检查应对是否成功。可以检查基于Maven的解决方案吗?你有其他建议吗?
修改
这是从目标模块调度程序servlet扫描的组件:
<context:component-scan base-package="my.package.target.module.controller" annotation-config="false"/>
答案 0 :(得分:4)
我认为你的问题是annotation-config =“false”。 annotation-config功能打开了@Autowired注释。如果没有自动连接,则不会注入mySimpleService属性并保持为null。然后你得到NullPointerException。
尝试
<context:component-scan base-package="my.package.target.module.controller" annotation-config="true"/>
BTW - 我从未使用过这种确切的配置,因为我不进行扫描。我总是使用单独的元素:
<context:annotation-config />