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

spring boot starter验证根本不起作用

锺离飞鸣
2023-03-14

我需要在我的Spring API中验证一些json输入和输出,我试图使用Spring boot starter验证(已经知道这不在spring-boot-starter-web中,所以我手动添加了它),但是当基于DTO类中的验证出现错误时,它从不抛出异常(MethodArgumentNotValidException)

完整的项目可以在github上fonud

我所尝试的:

>

  • 我尝试添加以下3个依赖项:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.13.Final</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    

    DTO:

    import lombok.*;
    
    
    import javax.validation.Valid;
    import javax.validation.constraints.*;
    import java.util.List;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class StudentDTO {
        @NotEmpty(message = "Username cant be empty")
        @Size(min = 2, max = 50, message = "Minimum 2 letters, max 50")
        String studentName;
        String message;
        Double averageScore;
        List<@Valid SubjectDTO> subjects;
    }
    
    import lombok.*;
    
    import javax.validation.constraints.*;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class SubjectDTO {
       @NotEmpty(message = "Subject name cant be empty")
       @Size(max = 30, message = "Max 30 letters")
       @Pattern(regexp = "[A-Z](\\p{L}||\\s)+", message = "Name should start with capital letter")
       String name;
       @Max(value = 10, message = "Max grade is 10.0")
       @Min(value = 0, message = "Min grade is 0.0")
       Double score;
    }
    
    
    import lombok.*;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class ErrorDTO {
       private String name;
       private String description;
    }
    

    Rest控制器:

    import com.practicastesting.diploma.dto.StudentDTO;
    import com.practicastesting.diploma.service.IObtenerDiplomaService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.*;
    
    import javax.validation.Valid;
    
    @RestController
    public class ObtenerDiplomaController {
       @Autowired
       IObtenerDiplomaService service;
    
       @PostMapping("/analyzeScores")
       public ResponseEntity<StudentDTO> analyzeScores(@RequestBody @Valid StudentDTO rq) {
           return new ResponseEntity<StudentDTO>(service.analyzeScores(rq), HttpStatus.OK);
       }
    }
    

    异常控制器:

    import com.practicastesting.diploma.dto.ErrorDTO;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.ResponseEntity;
    import org.springframework.http.converter.HttpMessageNotReadableException;
    import org.springframework.web.bind.MethodArgumentNotValidException;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.ResponseStatus;
    
    import java.util.Objects;
    
    @ControllerAdvice
    public class ExceptionController {
       @ExceptionHandler(MethodArgumentNotValidException.class)
       @ResponseBody
       @ResponseStatus(value = HttpStatus.BAD_REQUEST)
       protected ResponseEntity<ErrorDTO> handleValidationExceptions(MethodArgumentNotValidException e) {
           ErrorDTO error = new ErrorDTO("MethodArgumentNotValidException", Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
           return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
       }
    
    }
    
    
    {
       "studentName": "a",
       "subjects": 
           [
               {
                   "name": "Math",
                   "score": 115
               },
               {
                   "name": "Whatever",
                   "score": 7
               },
               {
                   "name": "Chemistry",
                   "score": 6
               }
           ]
    }
    
    
      null
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
       <parent>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-parent</artifactId>
           <version>2.5.4</version>
           <relativePath/> <!-- lookup parent from repository -->
       </parent>
       <groupId>com.practicastesting</groupId>
       <artifactId>diploma</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <name>diploma</name>
       <description>Demo project for Spring Boot</description>
       <properties>
           <java.version>11</java.version>
       </properties>
       <dependencies>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-validation</artifactId>
               <version>2.4.2</version>
           </dependency>
    
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
               <scope>runtime</scope>
               <optional>true</optional>
           </dependency>
           <dependency>
               <groupId>org.projectlombok</groupId>
               <artifactId>lombok</artifactId>
               <optional>true</optional>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-test</artifactId>
               <scope>test</scope>
           </dependency>
           <dependency>
               <groupId>javax.validation</groupId>
               <artifactId>validation-api</artifactId>
               <version>2.0.1.Final</version>
           </dependency>
           <dependency>
               <groupId>org.hibernate.validator</groupId>
               <artifactId>hibernate-validator</artifactId>
               <version>6.0.13.Final</version>
           </dependency>
           <dependency>
               <groupId>org.glassfish</groupId>
               <artifactId>javax.el</artifactId>
               <version>3.0.0</version>
           </dependency>
       </dependencies>
    
       <build>
           <plugins>
               <plugin>
                   <groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-maven-plugin</artifactId>
                   <configuration>
                       <excludes>
                           <exclude>
                               <groupId>org.projectlombok</groupId>
                               <artifactId>lombok</artifactId>
                           </exclude>
                       </excludes>
                   </configuration>
               </plugin>
           </plugins>
       </build>
    
    </project>
    
    
  • 共有1个答案

    关飞翼
    2023-03-14

    你好@Sebastián Villegas,我从GitHub下载了您的项目,并用您上面添加的请求证明了它,程序正在进行相应的验证(我从下面获得的结果):

    {
        "name": "MethodArgumentNotValidException",
        "description": "Minimum 2 letters, max 50"
    }
    

    重建您的项目。如果您使用IntelliJ IDEA作为IDE,请在菜单中转到Build->Rebuild Project

     类似资料:
    • 我的springboot版本是2.3.7。我知道spring boot starter验证不是spring boot starter web的可传递依赖项。但即使单独添加了它,我的注释也不起作用。 //下面的依赖我已经添加build.gradle编译'org.springframework.boot: spring-boot-starter-validation' //我希望在请求时出错的示例类

    • 我有一个php版本为7.0的Linux apache2 Web服务器。22.看起来设置根本不起作用:( 这个ini文件位于以下位置:根据。当我查看文件夹时,我看到三个文件(设置告诉我正在使用的文件),和。 所以我查找了,它是,我将它改为,然后。我对所有的人都这样做了。ini文件保存了它们,重新启动apache2并刷新了phpinfo()页面,但什么都没有发生。我试图在所有窗口中更改其他设置。ini

    • 当我使用null email向/注册用户发送一个POST请求时,我希望它会说“Hey,you have null in email field”,但由于语句,它会在保存步骤中抛出NPE。当我用错误的电子邮件发送json时,如下所示: 它完美地通过了这个约束注释: 我试过的。我尝试在@validemail、@get:validemail、@field:validemail(kotlin data c

    • 问题内容: 问题: 我正在使用OpenSAML构建对发布到我们服务器上的SAML 2.0响应进行身份验证的方法。我已经完成了大部分工作,并能够访问断言的各个方面。唯一的问题是,当我尝试使用下面的公钥来验证签名时,它指出“ 签名未针对凭证的密钥进行验证 ”。 有任何想法吗? 公钥: 签名: 实现方式: 问题答案: 好吧,事实证明上面的代码 是 正确的。样本SAML响应不正确。我想从这一切中学到的教训

    • 执行控制器方法时,我收到以下日志: ObjECT:[字段名称上的对象目录中的字段错误:拒绝值[safasf];代码[Pattern.catalog.name, Pattern.name, Pattern.java.lang.String, Pattern];参数[org.springframework.context.support.DefaultMessageSourceResolable:代码

    • 我正在按照本指南使用Spring表单验证,但我无法在自己的程序中验证表单。我完全按照指南中的描述去做,但在我的应用程序中却不起作用。 我使用Spring Tools Suite并下载了示例应用程序,以查看它是否真的可以工作。我看不出究竟是什么原因导致表单验证发生在示例应用程序中而不是我的应用程序中。我试图通过从POM中移除依赖项来缓慢地更改示例应用程序,以使其中断,但它继续工作.....到底是哪个