Failed to convert property value of type
(2012-10-26 13:37:40)
标签:
it |
分类: SSH |
j2ee ssh 整合项目时,出现了一下异常,最后发现,原来问题是这样是这样引起的。
先看异常:
--------------------------------------------------------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
Unable to instantiate Action, senlypan.action.UserAction, defined for 'user' in namespace '/'Failed to convert property value of type 'senlypan.action.UserAction' to required type 'senlypan.model.User' for property 'user'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [senlypan.action.UserAction] to required type [senlypan.model.User] for property 'user': no matching editors or conversion strategy found com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:306) com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387) com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186) org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory .java:39) com.opensymphony.xwork2.DefaultActionProxyFactor y.createActionProxy(DefaultActionProxyFactor y.java:47) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteF ilter.doFilter(StrutsPrepareAndExecuteF ilter.java:76)
root cause
org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'senlypan.action.UserAction' to required type 'senlypan.model.User' for property 'user'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [senlypan.action.UserAction] to required type [senlypan.model.User] for property 'user': no matching editors or conversion strategy found org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485) org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516) org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.convertForProperty(AbstractAutowireCapableB eanFactory.java:1406) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.applyPropertyValues(AbstractAutowireCapableB eanFactory.java:1365) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.populateBean(AbstractAutowireCapableB eanFactory.java:1118) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.autowireBeanProperties(AbstractAutowireCapableB eanFactory.java:374) com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:176) com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:158) com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:129) com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:139) com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:109) com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:287) com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387) com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186) org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) org.apache.struts2.impl.StrutsActionProxyFactory .createActionProxy(StrutsActionProxyFactory .java:39) com.opensymphony.xwork2.DefaultActionProxyFactor y.createActionProxy(DefaultActionProxyFactor y.java:47) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteF ilter.doFilter(StrutsPrepareAndExecuteF ilter.java:76)
root cause
java.lang.IllegalStateException: Cannot convert value of type [senlypan.action.UserAction] to required type [senlypan.model.User] for property 'user': no matching editors or conversion strategy found org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:241) org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470) org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516) org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableB eanFactory.java:1406) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.applyPropertyValues(AbstractAutowireCapableB eanFactory.java:1365) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.populateBean(AbstractAutowireCapableB eanFactory.java:1118) org.springframework.beans.factory.support.AbstractAutowireCapableB eanFactory.autowireBeanProperties(AbstractAutowireCapableB eanFactory.java:374) com.opensymphony.xwork2.spring.SpringObjectFactory.autoWireBean(SpringObjectFactory.java:176) com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:158) com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:129) com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:139) com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:109) com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:287) com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387) com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186) org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61) org.apache.struts2.impl.StrutsActionProxyFactory .createActionProxy(StrutsActionProxyFactory .java:39) com.opensymphony.xwork2.DefaultActionProxyFactor y.createActionProxy(DefaultActionProxyFactor y.java:47) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteF ilter.doFilter(StrutsPrepareAndExecuteF ilter.java:76)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.
异常解释: 大家请看上面红色的句子,如下
很明显, type
'senlypan.action.UserAction'
看的出来一个是action类,一个是model类,那么他们之间为什么出现这种异常呢?
原因是,在ssh整合项目中,由于struts框架使用spring-plugin ,当struts初始化时,struts
会自动装载 Action 类中属性(即
package senlypan.action;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import senlypan.model.User;
import senlypan.service.UserManager;
import senlypan.vo.UserRegisterInfo;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
@Component("user")
@Scope("prototype")
public class UserAction extends ActionSupport implements
ModelDriven {
}
从以上红色代码发现,UserAction 被初始化(被装载到初始化容器)时使用的名字为 user ,而UserAction的属性也有一个user (此为model包下的User类),所以当 struts 初始化时,由于使用了spring-plugin ,所以struts试图把UserAction类中的属性装载进初始化容器,则此时属性 user (model下的User)装载时,容器会首先寻找user,发现已经存在user(此时的user正是被装载到初始化容器UserAction),这是就出现了转换异常,即:
其实,这个归根到底,应该算是ssh的一个bug的,查看以下struts文档,在spring-plugin.html页面有一个设置,属性值为 struts.objectFactory.spring.autowire ,这个的描述即是,The autowire strategy , 他的默认值为 auto注入而且是 byName,所以当使用这个Spring-plugin时,action类中的属性(含setXxx())会被自动装载,这个我个人觉得有点不好,本来应该让开发人员自动注入属性的,所以这个是我个人觉得不好的地方,当然,觉得的方法就是把UserAction名字改为 @Component("u")UserAction或者@Component("userAction")或者其他,记得也要在struts.xml配置里面修改action包的名字和页面提交时调用的action名字!
文章仅为个人愚见,有高见者,请策之明见!