加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.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.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.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.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406)
        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365)
        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.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.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.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.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.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(AbstractAutowireCapableBeanFactory.java:1406)
        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365)
        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118)
        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.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.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.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.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.

 

 

异常解释: 大家请看上面红色的句子,如下

 

 Failed to convert property value of type 'senlypan.action.UserAction' to required type 'senlypan.model.User' for property 'user'

 

很明显, type 'senlypan.action.UserAction'  cant convert to   'senlypan.model.User'

看的出来一个是action类,一个是model类,那么他们之间为什么出现这种异常呢?

 

原因是,在ssh整合项目中,由于struts框架使用spring-plugin ,当struts初始化时,struts 会自动装载 Action 类中属性(即  setXxx() 方法),会把他们初始化到容器里面,所以由于我在UserAction类中使用了注解 @Component("user") ,以下即是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 {

 private UserRegisterInfo userInfo = new UserRegisterInfo(); // 是ModelDriven必须new
                // 个

 private UserManager userManager;

 private List users;

 private User user;

 public User getUser() {
  return user;
 }

 public void setUser(User user) {
  this.user = user;
 }

 public List getUsers() {
  return users;
 }

 public void setUsers(List users) {
  this.users = users;
 }

 public UserManager getUserManager() {
  return userManager;
 }

 @Resource(name = "userManager")
 public void setUserManager(UserManager userManager) {
  this.userManager = userManager;
 }

 public UserRegisterInfo getUserInfo() {
  return userInfo;
 }

 public void setUserInfo(UserRegisterInfo userInfo) {
  this.userInfo = userInfo;
 }

 @Override
 public String execute() throws Exception {

  User user = new User();
  user.setUsername(userInfo.getUsername());
  user.setPassword(userInfo.getPassword());

  if (userManager.exists(user)) {
   System.out.println("already exists");
   return "fail";
  }
  System.err.println(" add success ...");
  userManager.add(user);
  return SUCCESS;
 }

 @Override
 public Object getModel() {
  return userInfo;
 }

 // 动态方法调用 user!list.action?
 public String list() {
  this.users = this.userManager.getUsers();
  return "list";
 }
 
 // 动态方法调用 user!load.action?id=1
 public String load() {
  this.user = this.userManager.loadById(userInfo.getId());
  return "load";
 }
}

 

从以上红色代码发现,UserAction 被初始化(被装载到初始化容器)时使用的名字为 user ,而UserAction的属性也有一个user (此为model包下的User类),所以当 struts 初始化时,由于使用了spring-plugin ,所以struts试图把UserAction类中的属性装载进初始化容器,则此时属性 user (model下的User)装载时,容器会首先寻找user,发现已经存在user(此时的user正是被装载到初始化容器UserAction),这是就出现了转换异常,即:

 

 Failed to convert property value of type 'senlypan.action.UserAction' to required type 'senlypan.model.User' for property 'user'

 

其实,这个归根到底,应该算是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名字!

 

文章仅为个人愚见,有高见者,请策之明见!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有