Java 如何将类型转换器的使用限制在SpringMVC中的特定控制器上?
在SpringMVC中处理请求参数、路径变量或表单字段时,我必须处理Java 如何将类型转换器的使用限制在SpringMVC中的特定控制器上?,java,spring,validation,spring-mvc,converters,Java,Spring,Validation,Spring Mvc,Converters,在SpringMVC中处理请求参数、路径变量或表单字段时,我必须处理typeMismatch错误。它们发生在验证开始之前,有时会令人恼火。假设我有一个用标准验证约束注释的整数参数,类似于:@Min(value=0,message=“只能接受非负整数值”)。然后,我可以创建一个简单的字符串到整数转换器来抑制NumberFormatException,同时将所有不可解析的字符串值设置为-1,这样它们就可以通过前面提到的@Min约束进一步失效: @组件 最后一个类StringToInteger实现转换
typeMismatch
错误。它们发生在验证开始之前,有时会令人恼火。假设我有一个用标准验证约束注释的整数
参数,类似于:@Min(value=0,message=“只能接受非负整数值”)
。然后,我可以创建一个简单的字符串到整数转换器来抑制NumberFormatException
,同时将所有不可解析的字符串值设置为-1,这样它们就可以通过前面提到的@Min
约束进一步失效:
@组件
最后一个类StringToInteger实现转换器{
公共整数转换(字符串源){
试一试{
返回整数.valueOf(源);
}捕获(NumberFormatException ex){
返回-1;
}
}
}
当与Spring Boot一起使用时,
@组件
注释会自动启动此转换器并在整个应用程序上下文中运行,但是如果我想将其使用范围仅限于特定的控制器
甚至目标请求,该怎么办?最简单的方法是什么?您可以使用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);
}
}
@InitBinder
公共void自定义绑定(DataBinder绑定器){
addCustomFormatter(新StringToInteger());
}
类StringToInteger实现格式化程序{
@凌驾
公共整数解析(字符串s,区域设置)引发ParseException{
试一试{
返回整数。值为(s);
}
捕获(NumberFormatException ex){
返回-1;
}
}
@凌驾
公共字符串打印(整数i,区域设置){
返回Objects.toString(i);
}
}
它抛出java.lang.IllegalStateException:DataBinder已经用ConversionService初始化了
,似乎我可以使用@InitBinder
为单个控制器注册自定义格式化程序
或属性编辑器
,但不能注册转换器
。谢谢。格式化程序将用于转换请求参数、路径变量或表单字段。我认为这应该适用于您的用例。我可以设置转换没有错误,但我做了一个简单的项目。。。