【问题标题】:Entity validation messages not showing up in Spring mvc Rest controller实体验证消息未显示在 Spring mvc Rest 控制器中
【发布时间】:2021-10-28 23:09:57
【问题描述】:

我有一个休息控制器,它在请求正文中采用 Project 对象,使用 ProjectService 将其保存到数据库中。

@RestController
@RequestMapping("/api/project")
public class ProjectController {
    @Autowired
    private ProjectService projectService;
    
    @PostMapping(value = "", produces="application/json")
    public ResponseEntity<Project> createNewProject(@Valid @RequestBody Project project){
        Project proj1 = projectService.saveOrUpdate(project);
        return new ResponseEntity<Project>(proj1, HttpStatus.CREATED);
    }
}

实体Project 具有针对不同字段的验证和自定义验证消息,例如 -

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;    
@Entity
    @Table(name="project")
    public class Project {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id")
        private Long id;
        
        @Column(name="project_name")
        @NotBlank(message = "Project name cannot be blank")     
        private String projectName;
        
        @Column(name="project_identifier", updatable = false, unique = true)
        @NotBlank(message="Project Identifier cannot be blank")
        @Size(min = 4, max = 5, message="Please use 4-5 character identifier")
        private String projectIdentifier;
        
        @Column(name="description")
        @NotBlank(message = "Project description is required")
        private String description;
        
        @Column(name="start_date")
        @JsonFormat(pattern = "dd-mm-yyyy")
        private Date start_date;
        
        @Column(name="end_date")
        @JsonFormat(pattern = "dd-mm-yyyy")
        private Date end_date;
        
        @Column(name="created_at")
        @JsonFormat(pattern = "dd-mm-yyyy")
        private Date created_At;
        
        @Column(name="updated_at")
        @JsonFormat(pattern = "dd-mm-yyyy")
        private Date updated_At;
    
        //...getters and setters..
    }

我测试过这是 Postman。发送有效对象有效,但发送无效对象(空对象)不会给我错误消息。它只是给出了一个错误的请求错误。另外,为什么我会得到一个用于休息控制器错误的 HTML 页面?我期待一个 JSON 错误消息 -

这是 pom.xml 顺便说一句(我认为那里有一些不必要的东西)-

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <springframework.version>5.2.8.RELEASE</springframework.version>
        <springsecurity.version>5.4.0</springsecurity.version>
        <hibernate.version>5.4.1.Final</hibernate.version>
        <hibernate.validator.version>6.2.0.Final</hibernate.validator.version>
        <mysql.connector.version>8.0.25</mysql.connector.version>
        <c3po.version>0.9.5.5</c3po.version>

        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
        
        <dependency>
            <groupId>org.hibernate.validator</groupId> 
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate.validator.version}</version> 
        </dependency>

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>${c3po.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

我在这里做错了什么?请告诉我。谢谢!

编辑:语法

【问题讨论】:

    标签: java spring rest validation postman


    【解决方案1】:

    你可以试试Validating Programmatically

    import javax.validation.Validator;
    
    @RestController
    @RequestMapping("/api/project")
    public class ProjectController {
        @Autowired
        private ProjectService projectService;
        
         private Validator validator;
    
        ProjectController(Validator validator) {
            this.validator = validator;
        }
        
        @PostMapping(value = "", produces="application/json")
        public ResponseEntity<Project> createNewProject(@Valid @RequestBody Project project){
            Set<ConstraintViolation<Project>> violations = validator.validate(project);
            if (!violations.isEmpty()) {
                throw new ConstraintViolationException(violations);
            }
            Project proj1 = projectService.saveOrUpdate(project);
            return new ResponseEntity<Project>(proj1, HttpStatus.CREATED);
        }
    }
    

    欲了解更多详情,请访问以下链接: https://www.baeldung.com/spring-boot-bean-validation https://reflectoring.io/bean-validation-with-spring-boot/

    【讨论】:

      猜你喜欢
      • 2014-10-17
      • 2013-07-10
      • 2021-07-17
      • 2020-09-27
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2011-05-01
      • 2013-04-14
      相关资源
      最近更新 更多