org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to '

九月 03, 2012 4:57:02 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet cfj threw exception
org.apache.commons.beanutils.ConversionException: DateConverter does not support default String to 'Date' conversion.
 at org.apache.commons.beanutils.converters.DateTimeConverter.toDate(DateTimeConverter.java:468)
 at org.apache.commons.beanutils.converters.DateTimeConverter.convertToType(DateTimeConverter.java:343)
 at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156)
 at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60)
 at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470)
 at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1004)
 at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:456)
 at com.lxf.mu.FormUtil.fillform(FormUtil.java:22)
 at com.lxf.mu.AcionServlet.doPost(AcionServlet.java:26)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
 at java.lang.Thread.run(Unknown Source)

 

在Struts中我们经常要处理用户录入的日期字符串,将其转换为java.util.Date类型。在这里我们提供两种方式来实现这样的转换。

1 在ActionForm子类中,创建两个变量来处理日期,一个为Date类型,一个为String类型(临时变量),我们使用String类型的变量来接受用户的录入,再编码将其转换为Date类型,在页面输出时,在根据Date类型生成自定义的文本格式。这种方式灵活性大,不过需要你多付出点劳动。

2 编写一个plugin实现自动转换。Struts下各种对象类型的转换是通过BeanUtils的Converter实现,所以我们只需向 BeanUtils注册一个日期字符转换的Converter即可,这种方式不需要你编写代码进行转换,不过在页面呈现的时候,你可能需要进行格式化,从 Date对象之间生产的字符串(toString())往往不是你需要的,使用JSTL就可以的。

首先编写一个日期转换的Converter类:

Java代码   收藏代码
  1. import  java.text.SimpleDateFormat;  
  2. import  org.apache.commons.beanutils.Converter;  
  3. import  java.util.Set;  
  4. import  java.util.HashSet;  
  5. import  java.util.Iterator;  
  6. import  java.text.ParseException;  
  7.   
  8. /**  
  9.  
  10. * 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.  
  11. * @author zizz.  
  12. * Create Time:2006-9-11 19:11:47.  
  13. */   
  14. public   class  DateConverter  implements  Converter {  
  15.     /**  
  16.      * 日期格式化对象.  
  17.      */   
  18.     private   static  SimpleDateFormat df =  new  SimpleDateFormat();  
  19.       
  20.     /**  
  21.      * 模式集合.  
  22.      */   
  23.     private   static  Set<String> patterns =  new  HashSet<String>();  
  24.     //注册一下日期的转换格式   
  25.     static {  
  26.         DateConverter.patterns.add("yyyy-MM-dd" );  
  27.         DateConverter.patterns.add("yyyy-MM-dd HH:mm" );  
  28.         DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss" );  
  29.         DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss" );  
  30.     }  
  31.       
  32.     /**  
  33.      * 日期转换器.  
  34.      * @param type Class  
  35.      * @param value Object  
  36.      * return Date Object.  
  37.      */   
  38.     public  Object convert(Class type,Object value){  
  39.         if (value ==  null ){  
  40.             return   null ;  
  41.         }else   if (value  instanceof  String){  
  42.             Object dateObj = null ;  
  43.             Iterator it = patterns.iterator();  
  44.             while (it.hasNext()){  
  45.                 try {  
  46.                     String pattern = (String)it.next();  
  47.                     df.applyPattern(pattern);  
  48.                     dateObj = df.parse((String)value);  
  49.                     break ;  
  50.                 }catch (ParseException ex){  
  51.                     //do iterator continue   
  52.                 }  
  53.             }  
  54.             return  dateObj;  
  55.         }else {  
  56.             return   null ;  
  57.         }  
  58.     }  
  59. }  
  1. import java.text.SimpleDateFormat;  
  2. import org.apache.commons.beanutils.Converter;  
  3. import java.util.Set;  
  4. import java.util.HashSet;  
  5. import java.util.Iterator;  
  6. import java.text.ParseException;  
  7.   
  8. /** 
  9.  
  10. * 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象. 
  11. * @author zizz. 
  12. * Create Time:2006-9-11 19:11:47. 
  13. */  
  14. public class DateConverter implements Converter {  
  15.     /** 
  16.      * 日期格式化对象. 
  17.      */  
  18.     private static SimpleDateFormat df = new SimpleDateFormat();  
  19.       
  20.     /** 
  21.      * 模式集合. 
  22.      */  
  23.     private static Set<String> patterns = new HashSet<String>();  
  24.     //注册一下日期的转换格式   
  25.     static{  
  26.         DateConverter.patterns.add("yyyy-MM-dd");  
  27.         DateConverter.patterns.add("yyyy-MM-dd HH:mm");  
  28.         DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss");  
  29.         DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss");  
  30.     }  
  31.       
  32.     /** 
  33.      * 日期转换器. 
  34.      * @param type Class 
  35.      * @param value Object 
  36.      * return Date Object. 
  37.      */  
  38.     public Object convert(Class type,Object value){  
  39.         if(value == null){  
  40.             return null;  
  41.         }else if(value instanceof String){  
  42.             Object dateObj = null;  
  43.             Iterator it = patterns.iterator();  
  44.             while(it.hasNext()){  
  45.                 try{  
  46.                     String pattern = (String)it.next();  
  47.                     df.applyPattern(pattern);  
  48.                     dateObj = df.parse((String)value);  
  49.                     break;  
  50.                 }catch(ParseException ex){  
  51.                     //do iterator continue   
  52.                 }  
  53.             }  
  54.             return dateObj;  
  55.         }else{  
  56.             return null;  
  57.         }  
  58.     }  
  59. }  
import java.text.SimpleDateFormat;
import org.apache.commons.beanutils.Converter;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.text.ParseException;

/**
* 
* 日期转换对象,使用该转换器,在BaseForm当中做一下注册,系统自动地帮助字符的日期表示转换为java.util.Date对象.
* @author zizz.
* Create Time:2006-9-11 19:11:47.
*/
public class DateConverter implements Converter {
    /**
     * 日期格式化对象.
     */
    private static SimpleDateFormat df = new SimpleDateFormat();
    
    /**
     * 模式集合.
     */
    private static Set<String> patterns = new HashSet<String>();
    //注册一下日期的转换格式
    static{
        DateConverter.patterns.add("yyyy-MM-dd");
        DateConverter.patterns.add("yyyy-MM-dd HH:mm");
        DateConverter.patterns.add("yyyy-MM-dd HH:mm:ss");
        DateConverter.patterns.add("yyyy/MM/dd HH:mm:ss");
    }
    
    /**
     * 日期转换器.
     * @param type Class
     * @param value Object
     * return Date Object.
     */
    public Object convert(Class type,Object value){
        if(value == null){
            return null;
        }else if(value instanceof String){
            Object dateObj = null;
            Iterator it = patterns.iterator();
            while(it.hasNext()){
                try{
                    String pattern = (String)it.next();
                    df.applyPattern(pattern);
                    dateObj = df.parse((String)value);
                    break;
                }catch(ParseException ex){
                    //do iterator continue
                }
            }
            return dateObj;
        }else{
            return null;
        }
    }
}

 然后编写一个Struts的plugin,执行Converter注册:

Java代码   收藏代码
  1. public   class  ConvertPlugIn  implements  PlugIn {   
  2. public   void  destroy() {   
  3. ConvertUtils.deregister();   
  4. }   
  5. public   void  init(ActionServlet arg0, ModuleConfig arg1)   
  6. throws  ServletException {   
  7. ConvertUtils.register(new  DateConverter(), Date. class );   
  8. }   
  9. }  
  1. public class ConvertPlugIn implements PlugIn {   
  2. public void destroy() {   
  3. ConvertUtils.deregister();   
  4. }   
  5. public void init(ActionServlet arg0, ModuleConfig arg1)   
  6. throws ServletException {   
  7. ConvertUtils.register(new DateConverter(), Date.class);   
  8. }   
  9. }  
public class ConvertPlugIn implements PlugIn { 
public void destroy() { 
ConvertUtils.deregister(); 
} 
public void init(ActionServlet arg0, ModuleConfig arg1) 
throws ServletException { 
ConvertUtils.register(new DateConverter(), Date.class); 
} 
}

 

最后在struts-config.xml进行plugin声明:
<plug-in className="DateConverter" />

进行日期转换,这对Struts来说是非常有益的。Struts的ActionForm一直被认为是设计的缺陷,但是通过BeanUtils可以快速实现 ActionForm、VO、PO对象之间的转换,这就要求ActionForm设计比较合理,当然在ActionForm中实现从采集字符串到日期的转换会节省很多时间,我们只需关注域对象间的转换就可以啦。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值