日期:2014-05-17  浏览次数:20787 次

关于struts2中ognl泛型报错的疑问
简单的struts2登录
一个名为DataBean的bean中有两个属性data1  data2

action 方法中对DataBean使用泛型
public class Action4<T> {
private T dataBean;


public T getDataBean() {
return dataBean;
}


public void setDataBean(T dataBean) {
this.dataBean = dataBean;
}


public String execute(){
System.out.println("---Action4---"+((DataBean)dataBean).getData1());
System.out.println("---Action4---"+dataBean);
return "success";
}




}

前台登录页面为
<form action="a4.action" method="post">
<input type="text" name="dataBean.data1"><br/>
<input type="text" name="dataBean.data2"><br/>
<input type="submit" value="处理">
</form>

登录报错
警告: Error setting expression 'dataBean.data2' with value '[Ljava.lang.String;@b6d6ab'
ognl.NoSuchPropertyException: java.lang.Object.data2
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:166)


假如说action中不使用泛型则OK

试问 假如说我action中需要使用泛型  该如何修改
struts2??ognl??泛型

------解决方案--------------------
你错的不是泛型的问题
dataBean这个对象,没有data1和data2属性
------解决方案--------------------
1,调用struts的配置文件中的action名称,不知道你有写对了没,因为你没列出struts文件
2,前台的字段要与后台控制的action里面的属性相对应,你确定自己是否有正确对应
------解决方案--------------------
引用:
Quote: 引用:

1,调用struts的配置文件中的action名称,不知道你有写对了没,因为你没列出struts文件
2,前台的字段要与后台控制的action里面的属性相对应,你确定自己是否有正确对应


这个应该是OK的  我现在的问题是 假如我再这个action中  注入databean不用泛型  使用private Databean databean  这样的话就OK,我感觉问题是假如说你这样写 他就可以通过bean取出其属性或者也可以给属性赋值  但是假如说使用private T databean  前台传来就被认为是一个object 而无法为bean中的属性设置值  导致转换错误 。想请问下  有没有这种  在action中对bean做泛型话的编码方式 如果这样处理 那怎么解决转换的问题
首先我没用过!其次,我觉得前台传过来的值都是明确类型的,我不会去用泛型去做,宁愿多写一些代码或者配置!
------解决方案--------------------
你很幸运,遇到了我,我刚刚解决了这个问题。
使用泛型,有些地方是可以,但是这里是不行的,因为涉及到对象实例化。
你可以把dataBean的get、set方法写成抽象方法,dataBean这个对象去子类里用实际的类定义,然后重写get、set方法就可以了。
------解决方案--------------------
补充一点,在子类中重写get方法后,可能返回null,所以不能像原来那样直接return dataBean,你需要加一个判断,如果为null,需要手工创建一个 if (dataBean == null)  dataBean = new DataBean()