2

我正在开发包含几个子模块的应用程序。在其中一个模块上,我有这样的标题服务:

@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在 line:看到request.setAttribute("attr", mySimpleService.getAttribute());。所以这正是从另一个应用程序模块访问服务的问题。

我怎样才能做到这一点?

我听说过使用我的服务构建 EJB 并使用JNDI或使用 Maven 共享它的想法 - 在构建应用程序期间将文件夹与我的服务复制到目标模块。我试图做第二个选项,但它不起作用,我无法检查应对是否成功。是否可以检查基于 Maven 的解决方案?您还有其他建议吗?

编辑

这是来自目标模块调度程序 servlet 的组件扫描:

<context:component-scan base-package="my.package.target.module.controller" annotation-config="false"/>
4

1 回答 1

4

我认为您的问题是 annotation-config="false"。annotation-config 功能是打开@Autowired 注释的功能。如果没有自动装配,您的 mySimpleService 属性不会被注入并保持为空。然后你得到 NullPointerException。

尝试

<context:component-scan base-package="my.package.target.module.controller" annotation-config="true"/>

顺便说一句 - 我从来没有使用过这个确切的配置,因为我不做扫描。我总是使用单独的元素:

<context:annotation-config />
于 2012-10-18T18:50:27.790 回答