关于Struts2、Spring、Hibernate三大框架整合中碰到的异常
没有匹配名称空间[/]的Action
异常信息:
这个异常应该很多开发者都遇到过,出现这个异常的原因有很多种,我自己也尝试着结合自己遇到的问题以及前人的经验总结了一下可能会造成这个问题的因素:
检查struts.xml配置文件,包括文件的名称是否写错、文件路径(src)是否正确,文件的配置是否正确
检查web.xml文件,包括默认的欢迎页面的配置、struts过滤器的配置
检查动态方法调用的配置
检查struts约束文件版本
按照以上思路逐一排查,首先想到的肯定是struts.xml
文件,文件名正确,路径也没问题,之后检查配置似乎也没有问题,完了之后检查web.xml
文件,过滤器的配置以及默认首页的配置都没问题,郁闷了两分钟!完事之后想了下,我在struts.xml
配置了使用通配符访问Action中方法,即:
1 | <action name="UserAction_*" class="com.my.web.action.UserAction" method="{1}"> |
会不会是这里出现问题?之后在struts.xml
中开启了动态方法调用,即
1 | struts.enable.DynamicMethodInvocation = true |
这一配置默认情况下是false,启用后我以为能解决问题,是事实然并卵,又郁闷了两分钟!最后发现网上有人也遇到了这种问题,说有可能是约束文件的版本问题,2.3之后的约束在使用通配符方法Action中的方法的时候,还需要额外配置一个选项<allowed-methods>
,在此元素中配置允许通过通配符进行访问的方法,即:
1 | <allowed-methods>方法名1,方法名2...</allowed-methods> |
检查我自己的约束文件发现,我使用的2.5版本的约束,配置了allowed-methods
之后,发现可以正常访问了。
空指向异常
1 | java.lang.NullPointerException |
在Spring与中Struts2整合之后,如果Action的生命周期完全由Spring来管理,并且Action中存在有依赖属性,那么在struts.xml
中配置Action时,class属性的值必须与Spring的配置文件applicationContext.xml
中bean
元素的name
属性的值一致,否则将报空指针。比如,我在struts.xml配置了一个action:
1 | <package name="crm" namespace="/" extends="struts-default"> |
1 | <bean name="customerAction" class="com.my.web.action.CustomerAction" scope="prototype"> |
这里出现空指针表上面是因为action中class属性值与bean中name属性值不一致,实质上是因为在Action中声明了Service层的对象,因为如果在Action中没有声明Service层的对象,没有产生依赖,那么在struts.xml
中的action元素
的class属性
是可以通过完整类名来配置的,这样的话Action就会由Struts2负责创建而不是由Spring来创建。
1 | <package name="crm" namespace="/" extends="struts-default"> |