9

每当我在文本框中输入一个空字符串并尝试保存它时,我都会遇到这个错误我有这个错误:

Failed to convert property value of type java.lang.String to 
   required type double for property customerAcctSetting.maxAllowableAmount; 
nested exception is java.lang.IllegalArgumentException: Cannot convert value of 
    type [java.lang.String] to required type [double] for 
    property maxAllowableAmount:
PropertyEditor [bp.ar.util.NumberFormatUtil$CustomerDoubleEditor] returned
    inappropriate value

但是,当我输入无效的数字格式(例如“ddd”)时,会出现以下错误:

Failed to convert property value of type java.lang.String to required
    type double for property customerAcctSetting.maxAllowableAmount; 
nested exception is java.lang.NumberFormatException: For input string: "ddd"

我的控制器中有这个活页夹:

@InitBinder
public void initBinder(WebDataBinder binder) {
    NumberFormatUtil.registerDoubleFormat(binder);
}

我有一个NumberFormatUtil.java实现静态函数的类registerDoubleFormat(binder)

NumberFormatUtil.java

public static void registerDoubleFormat (WebDataBinder binder) {
    binder.registerCustomEditor(Double.TYPE, new CustomerDoubleEditor());
}

private static class CustomerDoubleEditor extends PropertyEditorSupport{    
    public String getAsText() { 
        Double d = (Double) getValue(); 
        return d.toString(); 
    } 

    public void setAsText(String str) { 
        if( str == "" || str == null ) 
            setValue(0); 
        else 
            setValue(Double.parseDouble(str)); 
    } 
}

我使用的是 Spring 3.0.1。我对java和其他相关技术(如spring)非常陌生。请帮忙。提前致谢。

4

3 回答 3

5

在这里更改您的 setAsText() 方法,

   public void setAsText(String str) { 
       if(str == null || str.trim().equals("")) {
           setValue(0d); // you want to return double
       } else {
           setValue(Double.parseDouble(str)); 
       }
  } 
于 2012-05-28T08:13:51.537 回答
4

我不知道这是否是您的问题的原因,但这str == ""是一个错误。

如果您正在测试一个 String 是否为空,请使用str.isEmpty()orstr.length() == 0甚至"".equals(str).

操作员测试两个==字符串是否是同一个对象。这不符合您的要求,因为您正在运行的应用程序中可能有许多不同的 String 实例代表相同的字符串。在这方面,空字符串与其他字符串没有什么不同。


即使这不是您的问题的原因,您也应该修复此错误,并记下不要用于==测试字符串。(或者至少,除非您采取了特殊步骤以确保它始终有效......这超出了本问答的范围。)

于 2012-05-28T02:57:21.023 回答
4

至于空字符串,我想问题是你的0被转换为Integer,而不是Double所以你必须使用后缀d : 0.0d ;

至于 NumberFormatException,我没有看到转换器无法转换它的任何问题。如果您想为转换错误提供自定义消息,您应该按照DefaultMessageCodeResolver的语义将该消息放入消息属性文件中, 我认为它类似于typeMismatch.java.lang.Double = "invalid floating point number" 并且在您的 bean 配置中具有消息源

    <bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>exceptions</value><!--- that means you have exceptions.properties in your class path with the typeMismatch string specified above-->
        </list>
    </property>
    </bean>

此外,属性编辑器的概念现在已经过时,带有转换器的新 API 是可行的方法,因为 spring 不会为使用这种方法编辑的任何属性创建一堆帮助对象(属性编辑器)。

于 2012-05-28T08:53:10.280 回答