其他分享
首页 > 其他分享> > 如何:Spring摆脱@Validate进行自动控制器验证?

如何:Spring摆脱@Validate进行自动控制器验证?

作者:互联网

我知道@Valid注释指示spring在这个例子中根据JSR-303验证例如一个Controller参数:

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

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

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

解决方法:

我终于遇到了一个可行的解决方案,从Spring配置的角度来看可能不是最优的(就像我说我是Spring初学者).

我们的想法是修改参数解析器(实现HandlerMethodArgumentResolver的解析器),用@RequestBody注释替换与参数关联的参数解析器.从默认类(即RequestResponseBodyMethodProcessor)创建一个继承的类,并覆盖类层次结构中的一个方法,该方法有效地确定是否执行验证(基于@Valid,@ Validated,@ ValidXxxxxx注释作为默认行为) ,使总是验证没有进一步检查.

所以这是代码(我使用的是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类,用于替换默认参数解析器:

@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以在Application配置类中提供自定义Bean:

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

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

}

标签:spring-mvc,spring,spring-boot-2,spring-aop,spring-validator
来源: https://codeday.me/bug/20190522/1153998.html