当前位置: 首页 > 知识库问答 >
问题:

如何:Spring去掉@验证以进行自动控制器验证?

钱震博
2023-03-14

我知道有一个有效的注释,它指示spring根据JSR-303验证一个控制器参数,在这个示例中:

@GetMapping("/test")
public TestDTO testDTO(@Valid TestDTO testDTO){
        return testDTO;
}

但我希望能够以某种方式配置Spring,以便在所有控制器中启用验证,而无需明确指定有效的注释。

这有可能吗?一些Spring配置?利用AOP?。。。

共有3个答案

濮嘉茂
2023-03-14

这应该是可能的,但就像马库斯在类似的问题上一样,我不确定我是否同意它解决了一个实际问题。

Spring将验证作为ModelAttributeMethodProcessor的validateIfApplicable方法中的模型绑定的一部分来执行,而不会深入到杂草中。根据javadoc

验证模型属性(如果适用)。默认实现检查@javax。验证。Valid、Spring的Validated和自定义注释,其名称以“Valid”开头。

要覆盖此功能,您需要创建一个自定义的ModelAttie teMethod odProczer/ServletModelAttie temetodProczer。然后您需要将其注册为参数解析

public class ApplicationConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addArgumentResolvers(final List<HandlerMethodArgumentResolver> argumentResolvers) {
        // add your custom model attribute processor here
    }
}
从焱
2023-03-14

不幸的是,没有“合法”的方法来做这件事。

此外,@Valid是不够的。您还需要一个BindingResult方法参数才能检查验证结果:bindingResult.has错误()

如果您不想使用BindingResult,您可以编写自己的验证器并在输入无效的情况下抛出异常。

盖诚
2023-03-14

我终于找到了一个可行的解决方案,从Spring配置的角度来看,它可能不是最佳的(正如我所说,我是Spring初学者)。

其想法是修改参数解析器(实现HandlerMethodArgumentResolver的解析器),用RequestBody注释替换与参数关联的参数解析器。从默认类(即RequestResponseBodyMethodProcessor)创建继承的类,并重写类层次结构中的方法,该方法有效地确定是否执行验证(基于是否存在有效的注释,将验证的注释作为默认行为),使始终验证,而无需进一步检查。

下面是代码(我使用的是Java 8 BTW):

扩展RequestResponseBodyMethodProcessor以定义验证策略(在这种情况下,始终验证):

public class MyRequestResponseBodyMethodProcessor extends RequestResponseBodyMethodProcessor {

    public MyRequestResponseBodyMethodProcessor(List<HttpMessageConverter<?>> converters) {
        super(converters);
    }

    @Override
    protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) {
        binder.validate();      // always validating @RequestMapping annotated parameters ;)
    }
}

定义用于替换默认参数解析器的配置类:

@Configuration
public class MyValidationAdapterConfigurer {

    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    // Injecting your own resolver
    @Autowired
    private RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor;


    @PostConstruct
    public void init() {

        // Don't know why but, removing the target resolver and adding the injected one to the end does not work!
        // Must be something related with the resolvers ordering. So just replacing the target in the same position.
        final List<HandlerMethodArgumentResolver> mangledResolvers = requestMappingHandlerAdapter.getArgumentResolvers().stream()
            .map(resolver -> resolver.getClass().equals(RequestResponseBodyMethodProcessor.class) ?
                requestResponseBodyMethodProcessor: resolver)
            .collect(Collectors.toList());

        requestMappingHandlerAdapter.setArgumentResolvers(mangledResolvers);
    }

}

最后配置Spring以在您的应用程序配置类中交付您的自定义Bean:

@Configuration
@PropertySource("classpath:api.properties")
public class MyRestApiConfiguration {

    @Bean
    @Autowired
    RequestResponseBodyMethodProcessor requestResponseBodyMethodProcessor(List<HttpMessageConverter<?>> converters) {
        return new MyRequestResponseBodyMethodProcessor(converters);
    }

}
 类似资料:
  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 5.2 使用Spring的验证器接口进行验证 {#toc_2} Spring具有一个Validator接口可以让你用于验证对象。Validator接口在工作时需要使用一个Errors对象,以便于在验证过程中,验证器可以将验证失败的信息报告给这个Errors对象。 让我们考虑一个小的数据对象: public class Person { private String name; p

  • 我试图在带有@valid注释的Spring REST控制器中使用Hibernate验证。 但验证没有发生。 下面是Maven构建必须要说的话: java.lang.AssertionError:状态应为:<400>,但实际为:<201> 注意AdminNotFoundException是由其他测试触发的。 但不触发MethodArgumentNotValidException。 下面是contro

  • 我创建了一个自定义验证器,以确保在提交帐户创建表单时,应用程序会捕获重复的用户名。 当我使用MockMVC对帐户创建控制器进行单元测试时,它失败了,因为验证器依赖于服务,所以我得到了空指针异常。 我怎么能嘲笑验证器或验证器所依赖的服务呢?我不知道如何让它工作,因为控制器不明确依赖于验证器,它在控制器之外运行。

  • 我想确保在创建新用户名或更新用户名时,用户名是唯一的。我写了下面的代码,它可以很好地创建和更新用户名。但是,如果只更新其他用户字段,如年龄或性别,并保留相同的用户名,它将返回invalid,因为用户名已经存在。 重要的是,我想要的验证是使用BindingResault。我已经有一个数据库,将用户名视为唯一的限制。但是现在我想要用BindingResault进行同样的验证。但是我更新用户时的方式会导

  • 我正在用Spring和Thymeleaf填表: MyForm如下所示: 正如您所看到的,我做了一个自定义注释,它应该检查输入值是否可以解析为: 现在在我的Controller类中,我正在执行以下操作: 但是,当试图将放入文本字段以测试验证时,获取: 下面是我读到的示例,并希望用自定义验证器进行扩展:http://viralpatel.net/blogs/spring-mvc-hashmap-for