`
fcm915
  • 浏览: 111385 次
  • 性别: Icon_minigender_1
  • 来自: 泰安
社区版块
存档分类
最新评论

No value specified解决办法收藏

    博客分类:
  • java
阅读更多
当用到了时间等非内置对象时,如果对象为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) {

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


        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类型属性进行赋值,然后进行属性拷贝,就可以避免你的错误。

分享到:
评论

相关推荐

    nginx+php出现No input file specified解决办法

    本文主要针对使用Nginx服务器配合PHP时出现的“No input file specified”错误进行原因分析和解决方案的介绍。这个错误通常意味着Nginx无法找到请求的PHP文件,导致无法正确处理用户的请求。 首先,这个问题的原因...

    oracle ora-00054:resource busy and acquire with nowait specified解决方法

    Oracle数据库在处理并发事务时,可能会遇到“ORA-00054: resource busy and acquire with NOWAIT specified”错误,这通常意味着当前操作试图获取一个已被其他事务占用的资源,而该请求又指定了不允许等待(NOWAIT)...

    commons-beanutils-jesse.zip

    注:该包在对null的Date转换时会抛出No value specified的异常。如需支持对null的Date转换,请下载我的“commons-beanutils-jesse.zip(20080717更新)”资源 详情:...

    oracle 错误一览表

    #### ORA-00053: Resource busy and acquire with NOWAIT specified - **描述**:资源忙且获取时指定了 NOWAIT。 - **解决方法**:移除 NOWAIT 或等待资源可用。 #### ORA-00054: Resource busy and acquire with ...

    数据库问题及解决方法

    在日常操作中,数据库用户可能会遇到各种问题,其中“ORA-00054: resource busy and acquire with nowait specified”是一个常见的错误,它通常出现在并发操作环境下,比如当一个事务正在处理数据而其他事务尝试立即...

    oracle错误代码大全

    #### ORA-00017: Resource busy and acquire with NOWAIT specified - **解释**: 当尝试获取一个资源(如锁)时,如果该资源被其他进程占用,并且请求中指定了`NOWAIT`选项,则会触发此错误。 - **解决方案**: 如果...

    Oracle 错误大全

    ##### ORA-00051: Resource Busy and Acquire With NOWAIT Specified - **描述**:资源繁忙并且使用NOWAIT指定获取。 - **解决方法**: - 尝试不使用NOWAIT选项重新获取资源。 - 杀死持有资源的进程。 ##### ORA-...

    数据库锁表问题解决方法

    比如对数据表进行插入(INSERT)、更新(UPDATE)或删除(DELETE)操作,或者是添加主键(PRIMARY KEY)或索引(INDEX)时,可能会遇到ORA-00054错误:“resource busy and acquire with NOWAIT specified”。...

    Objective-C 的模拟对象

    使用 OCMock – 简短版本 ...// set it up to return the specified value no matter how the method is invoked OCMStub([userDefaultsMock stringForKey:[OCMArg any]]).andReturn(@"http://testurl");

    2009 达内Unix学习笔记

    集合了 所有的 Unix命令大全 ...telnet 192.168.0.23 自己帐号 sd08077-you0 ftp工具 192.168.0.202 tools-toolss ... 各个 shell 可互相切换 ksh:$ sh:$ csh:guangzhou% bash:bash-3.00$ ... 命令和参数之间必需用空格隔...

    php.ini-development

    There is no name validation. If PHP can't find an expected ; directive because it is not set or is mistyped, a default value will be used. ; The value can be a string, a number, a PHP constant (e.g....

    ansys错误汇总大全,史上最全.pdf

    用户需要根据这些错误信息进行问题定位和解决。 2. 过多表达式错误:ANSYS提示“Too many expressions”时,表明用户在执行某命令时输入了过多的表达式。需要检查表达式的数量并进行相应的调整。具体到本例,“A22=...

    linux-JAVA图形处理

    linux-JAVA图形处理 错误信息1: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable. 错误信息2: Xlib: connection to ":0.0" refused by server Xlib: No protocol specified

    c___s_t_d_i_n_t_._h_____c(C语言 库文件)

    No other integer type exists with lesser size and at least the specified width. int_least16_t uint_least16_t int_least32_t uint_least32_t int_least64_t uint_least64_t int_fast8_t uint_fast8_t Integer ...

    oracle错误编码一览

    ### ORA-00017: Resource busy and acquire with NOWAIT specified 在尝试锁定资源时,如果资源当前正被其他事务占用,并且使用了NOWAIT选项,则会引发此错误。这通常发生在并发环境中,多个事务试图同时访问同一...

    nao机器人java语音源码

    /// &lt;returns&gt; Value of the specified parameter public float getParameter( String pParameterName) { Variant vpParameterName; vpParameterName = new Variant(pParameterName); Variant result = ...

    数位板压力测试

    sdk LCS/Telegraphics Wintab* Interface Specification 1.1: 16- and 32-bit API Reference By Rick Poyner Revised February 11, 2012 This specification was developed in response to a perceived need for a...

    oracle报错大全(珍藏版)

    #### ORA-00079: Value Not Specified 未指定值。这可能是由于DDL语句格式错误或逻辑错误。 #### ORA-00080: Value Fully Qualified 指定的值完全限定。这可能是由于配置错误或逻辑错误。 #### ORA-00081: Value ...

Global site tag (gtag.js) - Google Analytics