Spring新对象绑定异常:无法将String转换为long(原始类型)


问题内容

操作系统:Windows Vista,框架:Spring(最新),JQuery(最新),Hibernate(最新)。

我有一个主键为id的域类。

public class domain{
    private long id;
    ....
}

我的控制器定义:

    @RequestMapping("/domainJqgridData/save")
public @ResponseBody String saveJqgridData(DomainClass domainclass) throws Exception {  
    return "Saved successfully!";
}

提交JSP表单以添加新的DomainClass记录时,Spring控制器将尝试自动将请求参数绑定到域类。它引发如下的BindException:

请求处理失败;嵌套的异常是org.springframework.validation.BindException:org.springframework.validation.BeanPropertyBindingResult:1错误字段“
id”上的对象“
domain”中的字段错误:拒绝值[_empty];代码[typeMismatch.domainclass.id,typeMismatch.id,typeMismatch.long,typeMismatch];参数[org.springframework.context.support.DefaultMessageSourceResolvable:代码[domainclass.id,id];
参数[];
默认消息[id]];默认消息[无法将类型’java.lang.String’的属性值转换为属性’id’的必需类型’long’;嵌套的异常是org.springframework.core.convert.ConversionFailedException:无法将值“
_empty”从“ java.lang.String”类型转换为“
long”类型;嵌套的异常是java.lang.NumberFormatException:

当我添加新的DomainClass记录时,JSP表单将id字段作为null传递。Spring出于绑定目的将null
id转换为空字符串值,并引发错误。我浏览了网络,发现可以为此目的注册自定义编辑器。我将DomainClass基本类型定义long id更改为Long
id,并尝试如下绑定自定义编辑器。

Controller class:
@InitBinder
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Long.class, new CustomPrimitiveFormat(Long.class, true));
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

我的自定义基本编辑器类如下:

public class CustomPrimitiveFormat extends CustomNumberEditor{

public CustomPrimitiveFormat(Class numberClass, boolean allowEmpty)
    throws IllegalArgumentException {
    super(numberClass, allowEmpty);
    // TODO Auto-generated constructor stub
}

public void setValue(Object value){
    System.out.println("Entered CustomPrimitiveFormat setValue");
    if (value == null) {
        super.setValue(null);
        return;
    }
    if (value.getClass().equals(String.class)){
        if (StringUtils.isEmpty((String)value)){
            super.setValue(null);
        }
    }
}

public void setAsText(Object value){
    System.out.println("Entered CustomPrimitiveFormat setAsText");
    if (value == null) {
        super.setValue(null);
        return;
    }
    if (value.getClass().equals(String.class)){
        if (StringUtils.isEmpty((String)value)){
            super.setValue(null);
        }
    }
}

}

我仍然收到BindingException。添加新的Domain类记录时,找不到任何指导我如何克服Spring
BindException的链接。我希望我的主键保持原始类型,而不是使用Number对象类型。

在此先感谢您的帮助。


问题答案:

正如您在错误消息中看到的那样,jqGrid_empty用作新记录的ID,因此您需要更改将PropertyEditor其转换_emptynull