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对象类型。
提前感谢您的帮助。
答案 0 :(得分:2)
正如您在错误消息中看到的那样,jqGrid使用_empty
作为新记录的ID(另请参阅here),因此您需要更改PropertyEditor
以转换{ {1}}至_empty
。