我知道有一个有效的注释,它指示spring根据JSR-303验证一个控制器参数,在这个示例中:
@GetMapping("/test")
public TestDTO testDTO(@Valid TestDTO testDTO){
return testDTO;
}
但我希望能够以某种方式配置Spring,以便在所有控制器中启用验证,而无需明确指定有效的注释。
这有可能吗?一些Spring配置?利用AOP?。。。
这应该是可能的,但就像马库斯在类似的问题上一样,我不确定我是否同意它解决了一个实际问题。
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
}
}
不幸的是,没有“合法”的方法来做这件事。
此外,@Valid
是不够的。您还需要一个BindingResult
方法参数才能检查验证结果:bindingResult.has错误()
如果您不想使用BindingResult
,您可以编写自己的验证器并在输入无效的情况下抛出异常。
我终于找到了一个可行的解决方案,从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