在Spring MVC中处理请求参数、路径变量或表单字段时,我必须处理typeMismatch
错误。它们甚至在验证开始之前就发生了,这有时会令人恼火。假设我有一个用标准验证约束注释的Integer
参数,类似于:@Min(value = 0, message = "Only non-negative integer values can be accepted")
。然后,我可以创建一个简单的String to Integer转换器来抑制NumberFormatException
,同时将所有无法解析的字符串值设置为-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;
}
}
}
当使用with Spring Boot时,@Component
注解会自动启动这个转换器并在整个应用程序上下文中运行,但是如果我想将它的使用限制在特定的Controller
甚至目标请求上,该怎么办呢?最简单的方法是什么?
发布于 2020-08-07 04:18:15
您可以使用DataBinder。你可以在你的控制器中声明它。
@InitBinder
public void customizeBinding (DataBinder binder) {
DefaultConversionService conversionService = new DefaultConversionService();
conversionService.addConverter(new StringToInteger());
binder.setConversionService(conversionService);
}
EDIT:您可以使用格式化程序来代替。
@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);
}
}
https://stackoverflow.com/questions/63295039
复制相似问题