Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将类型转换器的使用限制在SpringMVC中的特定控制器上?_Java_Spring_Validation_Spring Mvc_Converters - Fatal编程技术网

Java 如何将类型转换器的使用限制在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实现转换

在SpringMVC中处理请求参数、路径变量或表单字段时,我必须处理
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
为单个控制器注册自定义
格式化程序
属性编辑器
,但不能注册
转换器
。谢谢。格式化程序将用于转换请求参数、路径变量或表单字段。我认为这应该适用于您的用例。我可以设置转换没有错误,但我做了一个简单的项目。。。