Java Spring控制器未调用@Valid
我知道这个问题在这里被问了好几次,但我找不到一个答案来帮助我 我试图在我的控制器上使用Java Spring控制器未调用@Valid,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,我知道这个问题在这里被问了好几次,但我找不到一个答案来帮助我 我试图在我的控制器上使用@Valid注释,但spring似乎不想对它做任何事情 以下是我正在做的: 版本: <org.springframework-version>4.0.5.RELEASE</org.springframework-version> <hibernate-annotations-version>3.5.6-Final</hibernate-annotations-versi
@Valid
注释,但spring似乎不想对它做任何事情
以下是我正在做的:
版本:
<org.springframework-version>4.0.5.RELEASE</org.springframework-version>
<hibernate-annotations-version>3.5.6-Final</hibernate-annotations-version>
控制器签名:
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy) {
什么都没有发生,一切都在继续
我似乎找不到答案
更新
我已经:
<hibernate-validator-version>4.3.1.Final</hibernate-validator-version>
因此,我将我的
验证api
更新为1.1.0。最终
没有异常,但仍然没有验证将Hibernate验证程序依赖项添加到POM中
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.1.Final</version>
</dependency>
org.hibernate
休眠验证器
5.1.1.最终版本
尝试在控制器签名(myclass mymy)之后传递BindingResult,如下所示
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy, BindingResult result) {
@RequestMapping(method=RequestMethod.POST)
@应答器
公共服务器响应addSomeClass(@RequestBody@Valid myclass mymy,BindingResult){
这通常适用于我,希望它也适用于你
@NotEmpty
是特定于Hibernate的,如果您想通过JSR-303验证bean,那么应该使用@NotNull
@Aph1ka
的建议使用BindingResult进行验证请提供有关项目设置的更多信息。您使用的是哪种spring版本?是否使用spring mvc?如果是,请检查您是否有。最新的spring版本应自动检测并拾取它 除此之外,您还必须使Validation正常工作
@Configuration
public class ValidationConfiguration
{
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean()
{
Locale.setDefault(Locale.ENGLISH);
return new LocalValidatorFactoryBean();
}
}
我觉得有必要查看您的pom,或者至少是与此问题相关的部分。我非常确定这是依赖项之间的版本不匹配。考虑到您的spring版本,下面是一个可能有效的组合:
<properties>
<spring.version>4.0.5.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
</dependencies>
4.0.5.1发布
org.springframework
弹簧芯
${spring.version}
org.springframework
弹簧网
${spring.version}
org.springframework
SpringWebMVC
${spring.version}
org.hibernate
休眠验证器
4.3.1.最终版本
=============编辑==========
只想补充一点,查看控制器的更多实现细节也很有价值。如果您提供默认错误处理程序,您使用的方法可能会有效(假设您有正确的工件组合)。否则,您必须执行@Aph1ka建议的操作。以下是一些可能性:
@RequestMapping(value = "foo")
public class SomeController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy) {
....
}
@ExceptionHandler
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public Error handleException(MethodArgumentNotValidException exception) {
return new ApiErrors(exception.getBindingResult());
}
}
@RequestMapping(value=“foo”)
公共类控制器{
@RequestMapping(method=RequestMethod.POST)
@应答器
public ServerResponse addSomeClass(@RequestBody@Valid myclass mymy){
....
}
@例外处理程序
@应答器
@ResponseStatus(值=HttpStatus.BAD_请求)
公共错误handleException(MethodArgumentNotValidException异常){
返回新的APIRERRORS(exception.getBindingResult());
}
}
或
@RequestMapping(method=RequestMethod.POST)
@应答器
public ServerResponse addSomeClass(@RequestBody@Valid myclass mymy,Errors){
if(errors.hasErrors()){
//返回一些视图的错误,例如。
返回新的响应属性(新的APIRERRORS(错误),HttpStatus.BAD_请求);
}
//....
}
或者,正如@Aph1ka所暗示的:
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy, BindingResult result) {
if (result.hasErrors()) {
// return some error view
}
// ....
}
@RequestMapping(method=RequestMethod.POST)
@应答器
公共服务器响应addSomeClass(@RequestBody@Valid myclass mymy,BindingResult){
if(result.hasErrors()){
//返回一些错误视图
}
// ....
}
我在测试控制器时遇到了类似的问题。这样添加时没有进行验证:
@InitBinder(“多媒体参数”)
但是没有名字,就像这样:
@InitBinder
由于我们添加了第二个验证器,最后一个选项不再可能。因此,不要在测试中执行此操作:
Object handler = handlerMapping.getHandler(request).getHandler();
handlerAdapter.handle(request, response, handler);
我们现在已经手动添加了特定的验证器:
ConfigurableWebBindingInitializer webBindingInitializer = new ConfigurableWebBindingInitializer();
webBindingInitializer.setValidator(multimediaValidator);
handlerAdapter.setWebBindingInitializer(webBindingInitializer);
Object handler = handlerMapping.getHandler(request).getHandler();
handlerAdapter.handle(request, response, handler);
通过这种方式,验证将按预期再次进行。虽然不美观,但很有效。of corse…它在我的配置下启用WebMVC类
@RequestBody
。您应该尝试对其进行调试。请注意,验证器。否则将提供默认实例(与您的配置等效)。可能会向我们展示整个MVC配置。您使用的是标准的@EnableWebMvc
?@PavelHold Spring文档说默认配置是“足够显示hibernate注释版本”。如果不是输入错误,hibernate validator(您想要的)与hibernate注释(处理ORM持久性)不同确保您的mvn也保持干净,当对pomYes进行此类更改时,我认为这一项也是相关的,尽管它取决于控制器的其他实现细节,例如,是否存在针对错误请求的异常处理程序等@dhipin-k-das为什么否决?检查规则。“否决表决的替代方案是什么?”有什么怨恨吗?我没有否决别人的投票!我只是改进了你的答案格式。自己检查一下!
@RequestMapping(value = "foo")
public class SomeController {
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy) {
....
}
@ExceptionHandler
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public Error handleException(MethodArgumentNotValidException exception) {
return new ApiErrors(exception.getBindingResult());
}
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy, Errors errors) {
if (errors.hasErrors()) {
// return error some view e.g.
return new ResponseEntity(new ApiErrors(errors), HttpStatus.BAD_REQUEST);
}
//....
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ServerResponse<Integer> addSomeClass(@RequestBody @Valid myclass mymy, BindingResult result) {
if (result.hasErrors()) {
// return some error view
}
// ....
}
Object handler = handlerMapping.getHandler(request).getHandler();
handlerAdapter.handle(request, response, handler);
ConfigurableWebBindingInitializer webBindingInitializer = new ConfigurableWebBindingInitializer();
webBindingInitializer.setValidator(multimediaValidator);
handlerAdapter.setWebBindingInitializer(webBindingInitializer);
Object handler = handlerMapping.getHandler(request).getHandler();
handlerAdapter.handle(request, response, handler);