如何在SpringMVC中将类型转换器的使用限制为特定的控制器



在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);
}
}

相关内容

  • 没有找到相关文章

最新更新