`

【转】commons.beanutils.ConversionException: No value specified解决办法

阅读更多

当用到了时间等非内置对象时,如果对象为NULL则,会出现此异常。最简单的方法就是保证非内置对象不为NULL。

还有其它高手给出的修改commons包相关源码的解决方案,也一并给出:

<1>时间解决方案:
方案一:
问题解决:
       读了他的源程序,发现日期java.sql.date主要是用org.apache.commons.beanutils.converters.SqlDateConverter类进行转的:
修改下面的代码就可以了
   public SqlDateConverter(Object defaultValue) {
         this.defaultValue = defaultValue;
         this.useDefault = true;   //原本为false;
     }

public SqlDateConverter() {
         this.defaultValue = null;
         this.useDefault = true;   //原本为false;   我也不记是那个是false了,反正修改为true就可以了
     }
方案二:

1、ActionForm里面有java.util.Date类型,但是页面没有输入,遇到错误。

2、利用BeanUtils.copyProperties(ActionForm, Model)时,因为ActionForm里面的java.util.Date那个字段为null又出现错误。

这两个问题都与BeanUtils.copyProperties方法有关 故解决思路是与解决BeanUtils问题。由于BeanUtils的这个方法还未内置ava.util.Date类型转换支持,因此首先把java.util.Date类型切换成java.sql.Date类型。

对于1来说,利用下列代码来解决,接桥接模式:

private java.sql.Date date;

public String getDateDisplay() {
     if (this.date==null) return null;
     DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.default,this.getLocale());
    return dateFormatter.format(this.date);
}

public void setDateDisplay(String dispaly){
     if (dispaly==null|| display.trim().equals("")) {
            this.date = null;
     } else {
            DateFormat dateFormatter = DateFormat.getDateInstance(DateFormat.default,this.getLocale());
             this.date = dateFormatter.parse(display);
     }
}

对第2个问题,方法是,实现自己的SqlDateConverter和SqlTimestampConverter类的convert方法:

package org.study.common.util;

import java.sql.Date;

import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.logging.*;

public final class SqlDateConverter implements Converter {

    private Log log = LogFactory.getLog(this.getClass());

    public SqlDateConverter() {
     
        this.defaultValue = null;
        this.useDefault = false;
    }

    public SqlDateConverter(Object defaultValue) {

        this.defaultValue = defaultValue;
        this.useDefault = true;
    }

    private Object defaultValue = null;

    private boolean useDefault = true;

    public Object convert(Class type, Object value) {

        if (value == null || "".equals(value)) {
            if (useDefault) {
                return (defaultValue);
            } else {
                throw new ConversionException("No value specified");
            }
        }

        if (value instanceof Date) {
            return (value);
        }

        try {
            return (Date.valueOf(value.toString()));
        } catch (Exception e) {
         log.error("convert error ocured.", e);
            if (useDefault) {
                return (defaultValue);
            } else {
                throw new ConversionException(e);
            }
        }
    }
}

对SqlTimestampConverter也类似处理,然后在BaseAction中添加如下代码
static {
      ConvertUtils.register(new SqlDateConverter(null), java.sql.Date.class);
      ConvertUtils.register(new SqlTimestampConverter(null), java.sql.Timestamp.class);
}

在解决这个问题时,发现一个第3放的Bean Mapper工具dozer很不错的,它是基于BeanUtils开发的类拷贝和属性转换开源包。

3、发现下面代码中居然报Bean error not defined in any scope。

<logic:messagesPresent>      
<html:messages id="error">
   <bean:write name="error"/>
</html:messages>
    </logic:messagesPresent>

经过仔细派查,发现问题在于在Action中保存错误消息:
errors.add(Globals.ERROR_KEY, new ActionMessage( 
       "error.saveStudent", student.getName(), ex.getMessage()));
时,忘了在资源文件中定义error.saveStudent,从而造成该错误消息并未真正生成,也就当然不存在Bean了了:) 寒啊.....

4、Eclipse的PropertyEditor每次都把中文的资源文件变成乱码。处理办法:
1)在window-->preference-->General-->Content Types中设置java propertiy files为GB2312编码。
2)用ant来做native2ascii转换:
<?xml version="1.0" encoding="GB2312" ?>

<project basedir=".">
<property name="app.home" value="." />
<property name="src.home" value="${app.home}/src" />
<property name="web.home" value="${app.home}/WebRoot" />
<property name="lib.home" value="${web.home}/WEB-INF/lib" />
<property name="classes.home" value="${web.home}/WEB-INF/classes" />
<property name="resources.package" value="java/resources" />
<property name="resources.src" value="${src.home}/${resources.package}"/>
<property name="resources.dest" value="${classes.home}/${resources.package}"/>

<path id="compile.classpath">
   <pathelement location="${lib.home}" />
   <pathelement path="${lib.home}" />
</path>

<!--主要完成资源文件的编码文件格式转换和拷贝到目标资源。-->
<target name="resources">
   <delete includeemptydirs="true" quiet="true">
    <fileset dir="${resources.dest}">
     <include name="*.properties"/>
    </fileset>
   </delete>
   <mkdir dir="${resources.dest}"/>
   <native2ascii encoding="GB2312" src="${resources.src}" dest="${resources.dest}" includes="**/*_zh_CN.properties" />
   <copy todir="${resources.dest}">
    <fileset dir="${resources.src}">
     <include name="*.properties"/>
     <exclude name="*.zh_CN.properties"/>
    </fileset>
   </copy>
</target>

</project>


<2>大字段解决方案:
做属性拷贝的时候类型为BigDecimal属性的值是null,所以会出现这样的错误。 
因为如果你看BeanUtils的源代码就知道,对于BigDecimal类型的属性其对应的转换器类BigDecimalConverter在调用convert方法的时候会做如下判断:


Java code 
    public Object convert(Class type, Object value) {
[color=#FF6600]
        if (value == null) {
            if (useDefault) {
                return (defaultValue);
            } else {
                throw new ConversionException("No value specified");
            }
        }[/color]

        if (value instanceof BigDecimal) {
            return (value);
        }

        try {
            return (new BigDecimal(value.toString()));
        } catch (Exception e) {
            if (useDefault) {
                return (defaultValue);
            } else {
                throw new ConversionException(e);
            }
        }

    }

红色部分就是产生这个错误的原因,首先被拷贝对象的该属性值为null,同时useDefault是false(这个在BigDecimalConverter类默认实例化的时候就定义了,如下代码:)


Java code 
    public BigDecimalConverter() {

        this.defaultValue = null;
        this.useDefault = false;

    }

所以会产生你所遇到的错误。

对bBean这个对象中的BigDecimal类型属性进行赋值,然后进行属性拷贝,就可以避免你的错误。

分享到:
评论

相关推荐

    org.apache.commons.beanutils.BeanUtils实例

    此为BeanUtils的实例。其中apache的包有一个小的BUG已在其中说明。

    org.apache.commons.beanutils.jar

    这个库的核心是`org.apache.commons.beanutils`包,其中包含了大量的辅助方法,使得开发者可以更加便捷地处理JavaBean属性,避免了直接调用getter和setter方法的繁琐过程。 Apache Commons BeanUtils库的核心功能:...

    commons-beanutils-1.9.4-API文档-中文版.zip

    标签:beanutils、commons、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    com.springsource.org.apache.commons.beanutils-1.7.0.jar

    jar包,官方版本,自测可用

    org.apache.commons.commons-math3:3.6.1

    Apache Commons Math 3.6.1 是一个由Apache软件基金会开发的开源库,它提供了广泛的数学和统计功能,适用于各种编程任务。这个版本是3.6.1,意味着它是对之前版本的改进和增强,可能包括错误修复、性能优化以及新...

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方案

    总之,要解决`java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource`的问题,你需要确保你的项目正确包含了Apache Commons DBCP及其相关依赖,并正确配置了`BasicDataSource`。同时,了解...

    com.springsource.org.apache.commons.beanutils-1.8.0.jar

    jar包,官方版本,自测可用

    commons-beanutils-1.8.3和commons-beanutils-1.8.0

    1. **属性访问**:BeanUtils提供了一系列方法如`getProperty()`和`setProperty()`,可以方便地读取和设置JavaBean对象的属性,无需手动编写getter和setter方法。 2. **类型转换**:通过`convert()`方法,BeanUtils...

    commons-beanutils-1.7.0.jar-解决commons-beanutils和commons-collections重复类

    解决办法是把commons-beanutils中的org/apache/commons/collections删除,这里上传一个改好可以直接使用的。

    可用org.apache.commons.httpclient-3.1.0.jar.zip

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....

    commons-beanutils-1.7.0-src.zip

    - `org.apache.commons.beanutils.BeanUtils`: 这是核心类,包含了许多公共的静态方法,如前面提到的`getProperty()`, `setProperty()`, `copyProperties()`等。 - `org.apache.commons.beanutils.PropertyUtils`: ...

    commons-beanutils-1.9.4.jar.zip

    9. **与其他Apache Commons库的集成**:BeanUtils可以很好地与Apache Commons其他库(如Collections、Lang等)结合使用,增强应用的功能。 10. **文档与社区**:Apache Commons项目提供了详细的API文档和用户指南,...

    commons-beanutils-1.9.4-API文档-中英对照版.zip

    标签:beanutils、commons、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    org.apache.commons.lang jar包下载

    META-INF/MANIFEST.MFMETA-INF/LICENSE.txtMETA-INF/NOTICE.txtorg.apache.commons.lang.ArrayUtils.class org.apache.commons.lang.BitField.class org.apache.commons.lang.BooleanUtils.class org.apache....

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource

    在这个特定的错误中,我们看到的是`org.apache.commons.dbcp.BasicDataSource`,这是Apache Commons DBCP库中的一个类,用于管理数据库连接池。这个异常通常意味着在应用的类路径(ClassPath)中没有包含DBCP的jar...

    commons-beanutils-1.6.1-src.zip

    库中还包含了丰富的异常处理机制,如`org.apache.commons.beanutils.converters`包下的各种`ConversionException`,用于处理类型转换失败的情况。 4. **国际化与本地化** Commons BeanUtils也考虑到了多语言环境...

    commons-beanutils-1.7.0-API文档-中英对照版.zip

    标签:beanutils、commons、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    commons.jar +commons-beanutils.jar

    标题中的"commons.jar +commons-beanutils.jar"指的是Apache Commons项目中的两个核心组件:commons.jar和commons-beanutils.jar。Apache Commons是Java编程语言中的一系列小型实用程序库,为开发人员提供了各种常见...

    commons-beanutils-1.8.0 jar包下载

    commons-beanutils-1.8.0 jar包: 1.commons-beanutils-1.8.0.jar 2.commons-beanutils-1.8.0-javadoc.jar 3.commons-beanutils-1.8.0-sources.jar 4.commons-beanutils-bean-collections-1.8.0.jar 5.commons-...

Global site tag (gtag.js) - Google Analytics