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 mvc showcase的工作示例。


  • 请提供有关项目设置的更多信息。您使用的是哪种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);