0%

Struts2 参数依赖注入失败


这是在 SegmentFault 上看到的一个问题,正好前不久学习了 J2EE 的 SSH 框架,看到这个问题忍不住答了一下。结果问题并不像表面上那么简单。没办法,自己挖的坑,跪着也要填完( ▼-▼ )。原问题链接:

struct2框架jsp页面传参失败

源码

和提问者要了源码,方便查找BUG。源代码太长,我就截取了部分代码。

addFlower.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
<s:form action="addFlower" method="post">
<table width="380" >
<tr>
<td>鲜花ID:</td>
<td>
<s:textfield id="goodsId" name="goods.goodsId"/>
</td>
</tr>
<tr>
<td><input type="submit" value="添加" class="btn" />
</tr>
</table>
</s:form>
struts.xml
1
2
3
4
5
<package name="flowers" namespace="/" extends="struts-default">
<action name="addFlower" class="flowers" method="addFlowerInfo">
<result name="index">/flowerInformation/flowerInformation.jsp</result>
</action>
</package>
applicationContext.xml
1
2
3
4
5
6
7
<bean name="adminUser" class="com.xhydxs.action.AdminUserAction"
scope="prototype">
<property name="adminUserBiz" ref="adminUserBiz" />
</bean>
<bean name="flowers" class="com.xhydxs.action.FlowerAction" scope="prototype">
<property name="flowerBiz" ref="flowerBiz" />
</bean>
FlowerAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class FlowerAction extends ActionSupport
implements RequestAware, SessionAware {

private Goods goods;

public Goods getGoods() {
return goods;
}

public void setGoods(Goods goods) {
this.goods = goods;
}

public String addFlowerInfo() {
System.out.println("goods:" + goods);
return "index";
}
}

运行

基本上看这些代码是完全正确的啊,并没有什么错误【后来证明确实也没有错误( ╯□╰ )】。拿到项目代码的我运行了下【运行前由于环境不同,我配置了好久啊啊啊啊!】,输出一直是 goods:null。这我就非常奇怪了,和之前写的 J2EE 项目对比了下,套路都是一样的啊!后来我发现了上面的一堆错误信息【为什么不早点看这些错误信息呢】,基本上都是围绕着下面这个错误:

1
Caused by: java.lang.IllegalStateException: Cannot convert value of type [com.xhydxs.action.AdminUserAction] to required type [com.xhydxs.entity.AdminUser] for property 'adminUser': no matching editors or conversion strategy found

解决

可以发现是类型转化问题,为什么会让 AdminUserAction 转化成 AdminUser 呢?这两个类怎么会互相转化呢?于是我使用全局查找 AdminUserAction 和 AdminUser 这两个关键词【用 Atom 编辑器】。终于让我发现以下的代码!!!

applicationContext.xml
1
2
3
4
<bean name="adminUser" class="com.xhydxs.action.AdminUserAction"
scope="prototype">
<property name="adminUserBiz" ref="adminUserBiz" />
</bean>
Goods.hbm.xml
1
2
3
4
<many-to-one name="adminUser" class="com.xhydxs.entity.AdminUser"
fetch="select">
<column name="UPD_OPR" length="20" not-null="true" />
</many-to-one>

发现了么?name 都是 adminUser,然而 class 分别对应着 AdminUserAction 和 AdminUser。然后把 AdminUserAction 对应的 name 改掉就行了。。。。至于为什么上面这个错误会导致 goods 为 null,因为在 Goods 类里有一个 AdminUser 成员变量,导致 struts 没法构建 goods 这个实例了>3<


分享精彩,留下足迹

欢迎关注我的其它发布渠道