2012-05-07 31 views
5

我有这样的形式与参数yearname弹簧MVC不会绑定我的请求参数为int

/register?year=&name=test 

我的类看起来是这样的:

public class Organizer { 
    private String name; 
    private int year; 

我的控制器的映射两个参数到我的班级Organizer

@RequestMapping("/register") 
public String register(@Valid Organizer organizer, BindingResult errors... 

问题是bindi将参数设置为int。弹簧给我错误

无法将'java.lang.String'类型的属性值转换为属性'year'所需的类型'int';嵌套的例外是java.lang.IllegalArgumentException异常:

我想通了如何添加自己的自定义属性编辑器,但getValue()似乎从来没有被称为

@InitBinder 
public void binder(WebDataBinder binder) { 
    binder.registerCustomEditor(int.class, new CustomIntEditor()); 
} 

public class CustomIntEditor extends PropertyEditorSupport { 

我想我应该能够返回int价值0当打之年的参数是任何其他比int值(Integer.parseInt() - >捕获异常)

@Override 
public void setAsText(String text) throws IllegalArgumentException { 

    //Some parsing and error handling 
    setValue((int)0); 
} 

我想能够:

  • 设置字段yearint价值0

  • 创建自定义错误消息:organizer.year.invalid

回答

7

变更int变为Integer。这是一个自动装箱问题。由于year为空,因此无法将其转换为原始值(因为您尚未指定默认值)。

然后你可以注释它@NotNull得到你想要的验证。

+0

是的工作!以为我可以找到一种方法来使它只与int – Tommy

+1

我想你最初寻找的是一个'ConversionService'('binder.setConversionService(...)'),而不是'CustomEditor'。 ConversionService可以将字符串转换为整数,如果字符串为空,则将整数设置为0。我更喜欢使用非原始类型,因为它使整个事情毫无意义:) – pap

+0

是的,转换是我一直在寻找的功能! – Tommy

0

首先,尝试运行在调试模式下的应用程序,并找出它抛出错误的确切线路并提供确切的详细信息
我认为ere必须是数据类型的问题(表单声明) 如果您使用的是hibernate,请检查您的hibernate实体类。

并检查year属性的数据类型。