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

时间:2010-12-06 17:51:50

标签: spring spring-mvc

OS:Windows vista,Framework: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]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable:codes [domainclass.id,id];参数[];默认消息[id]];默认消息[无法将类型'java.lang.String'的属性值转换为属性'id'的必需类型'long';嵌套异常是org.springframework.core.convert.ConversionFailedException:无法将值“_empty”从类型'java.lang.String'转换为'long'类型;嵌套异常是java.lang.NumberFormatException:对于输入字符串:“_ empty”]       org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656)       org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)       javax.servlet.http.HttpServlet.service(HttpServlet.java:637)       javax.servlet.http.HttpServlet.service(HttpServlet.java:717)       org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)

当我添加新的DomainClass记录时,id字段由JSP表单传递为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对象类型。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

正如您在错误消息中看到的那样,jqGrid使用_empty作为新记录的ID(另请参阅here),因此您需要更改PropertyEditor以转换{ {1}}至_empty