开发环境:
jdk: 1.6
struts2: 2.3.1
spring framework: 3.0.5 Release
背景:
通常在j2ee开发中,控制层会调用service层,而service层通常由注入框架管理(在本文中使用spring )
问题:
client 端页面可以正常调用控制层,但debug 下来,控制层中的 service 层为null,而导致 NullPointException。
解决方法:
1)首先控制层类,如 UserAction,要由spring IOC容器管理,可以在 spring配置中,使用显示声明的方式在xml中配置 action bean,
或者,直接在action 类上采取Annotation的方式注解。同时,service类也使用类似方式注入。
2)在项目类路径下的 struts.xml 文件中,加上以下配置,这样当项目调用控制层时,就会使用 spring ioc 容器中的类,而不是重新实例化一个类(导致service类为null)。注意:value = "spring",需要调用 org.apache.struts2.spring.StrutsSpringObjectFactory 类,这个类在 struts2-spring-plugin.jar包中,需要引入这个 jar 包。
3)在 struts2 的action 配置中,比如XML,使用 spring IOC 容器中的bean name。
如果之前action类使用spring xml 显示声明配置,这个beanName 注意和 xml 配置中bean name 一致;
如果之前action类使用 spring annotation 方式配置,且未指定名称,这个beanName 默认首字母小写后面一致。如果指定名称,则应该和指定的名称一致。