在Spring MVC中处理请求参数、路径变量或表单字段时,我必须处理typeMismatch
错误。它们发生在验证开始之前,有时会令人恼火。假设我有一个用标准验证约束注释的Integer
参数,有点像:@Min(value = 0, message = "Only non-negative integer values can be accepted")
。然后,我可以创建一个简单的String到Integer转换器来抑制NumberFormatException
,同时将所有不可解析的String值设置为-1,这样它们就可以通过前面提到的@Min
约束进一步失效:
@Component
final class StringToInteger implements Converter<String, Integer> {
public Integer convert(String source) {
try{
return Integer.valueOf(source);
} catch (NumberFormatException ex) {
return -1;
}
}
}
当与Spring Boot一起使用时,@Component
注释会自动启动该转换器并在整个应用程序上下文中运行,但如果我想将其使用限制在特定的Controller
甚至目标请求,该怎么办?最简单的方法是什么?
您可以使用DataBinder。您在控制器中声明。
@InitBinder
public void customizeBinding (DataBinder binder) {
DefaultConversionService conversionService = new DefaultConversionService();
conversionService.addConverter(new StringToInteger());
binder.setConversionService(conversionService);
}
编辑:您可以使用格式化程序。
@InitBinder
public void customizeBinding (DataBinder binder) {
binder.addCustomFormatter(new StringToInteger());
}
class StringToInteger implements Formatter<Integer> {
@Override
public Integer parse(String s, Locale locale) throws ParseException {
try {
return Integer.valueOf(s);
}
catch (NumberFormatException ex) {
return -1;
}
}
@Override
public String print(Integer i, Locale locale) {
return Objects.toString(i);
}
}