mumei2018 发表于 2024-2-18 12:23:14

请问实体类里的校验注解不生效是什么原因

请问实体类里的校验注解不生效是什么原因
/bigEventB/src/main/java/com/ms/bigEventB/pojo/User.java 路径下 实体类代码如下

package com.ms.bigEventB.pojo;



import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

@Data
public class User {
       
        @NotNull
        private Integer id;//主键ID
    private String username;//用户名
    @JsonIgnore
    private String password;//密码
    @NotEmpty
    @Pattern(regexp = "^\\S{5,10}")
    private String nickname;//昵称
    @NotEmpty
    @Email
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}

/bigEventB/src/main/java/com/ms/bigEventB/controller/UserController.java 路径下controller类代码如下

package com.ms.bigEventB.controller;

import java.util.HashMap;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.ms.bigEventB.pojo.Result;
import com.ms.bigEventB.pojo.User;
import com.ms.bigEventB.service.UserService;
import com.ms.bigEventB.util.JwtUtil;
import com.ms.bigEventB.util.Md5Util;
import com.ms.bigEventB.util.ThreadLocalUtil;

import jakarta.validation.constraints.Pattern;

@Validated
@Mapper
@RestController
@RequestMapping("user")
public class UserController {
       
        @Autowired
        private UserService userService;
       
        @PostMapping("/register")
        public Result register(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}")String password) {
                User u = userService.findByUserName(username);
                if(u == null) {
                        userService.register(username, password);
                        return Result.success();
                }else {
                        return Result.error("用户名已被占用");
                }
        }
       
//        @PostMapping("/login")
//        public Result<String> login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}")String password) {
//                User loginUser = userService.findByUserName(username);
//                if (loginUser == null) {
//                        return Result.error("用户名错误");
//                }
//               
//                if (Md5Util.getMD5String(password) == loginUser.getPassword()) {
//                        return Result.success("jwt token");
//                }
//               
//                return Result.error("密码错误");
//               
//               
//        }
       
        @PostMapping("/login")
        public Result<String> login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}")String password){
               
                User loginUser = userService.findByUserName(username);
               
                if(loginUser == null) {
                        return Result.error("用户名错误");
                }
               
                if(Md5Util.getMD5String(password).equals(loginUser.getPassword())){
                       
                        Map<String, Object> claims = new HashMap<>();
                        claims.put("id", loginUser.getId());
                        claims.put("username", loginUser.getUsername());
                        String token = JwtUtil.genToken(claims);
                        return Result.success(token);
                       
                       
                }
               
                return Result.error("密码错误");
               
               
        }
       
        @GetMapping("/userInfo")
        public Result<User> userInfo(/*@RequestHeader(name="Authorization")String token*/){
//                Map<String, Object> map = JwtUtil.parseToken(token);
//                String username = (String) map.get("username");
                Map<String, Object> map = ThreadLocalUtil.get();
                String username = (String) map.get("username");
                User user = userService.findByUserName(username);
                return Result.success(user);
        }
       
        @PutMapping("/update")
        public Result update(@RequestBody User user) {
                userService.update(user);
                return Result.success();
        }
       
       
       
       
       

}

xml文件里的代码如下
<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 http://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>3.2.2</version>
</parent>



<groupId>com.ms</groupId>
<artifactId>bigEventB</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>bigEventB</name>
<url>http://maven.apache.org</url>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
          <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          <dependency>
                  <groupId>org.mybatis.spring.boot</groupId>
                  <artifactId>mybatis-spring-boot-starter</artifactId>
                  <version>3.0.3</version>
          </dependency>
          <dependency>
                  <groupId>com.mysql</groupId>
                  <artifactId>mysql-connector-j</artifactId>
          </dependency>
          <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
          </dependency>
          <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-validation</artifactId>
          </dependency>
          <dependency>
                  <groupId>com.auth0</groupId>
                  <artifactId>java-jwt</artifactId>
                  <version>4.4.0</version>
          </dependency>
          <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>                  
          </dependency>
          
        <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
        </dependency>
          <!-- Spring Boot Data JPA -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
   
    <!-- H2 Database -->
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <scope>test</scope>
    </dependency>
   
    <!-- Jackson Databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </dependency>
   
    <!-- JUnit 5 -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <scope>test</scope>
    </dependency>

   </dependencies>
</project>

FishC 发表于 2024-2-18 12:23:35

实体类中的校验注解不生效的原因可能有以下几种:

1. 未设置校验配置:为了使校验注解生效,需要在项目的配置文件中配置校验器。你可以在application.yml或application.properties文件中添加以下配置:

# 开启校验
spring.mvc.validation.enabled=true

2. 未使用@Validated注解标记控制器类:在UserController类上添加@Validated注解,以便启用校验。

3. 未传递实体类对象给校验器:在UserController的相关接口方法中,要求使用@RequestBody注解将前端传递的JSON数据转换为User对象,并将User对象作为参数传递给方法。例如:

@PostMapping("/register")
public Result register(@Validated @RequestBody User user) {
    // ...
}

4. 校验注解被应用在了错误的位置:校验注解应该被应用在实体类的字段上,而不是方法参数上。请检查User实体类中的注解是否正确放置在字段上。

请检查以上几个方面,如果问题仍然存在,请提供更多的代码和错误信息以供进一步分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

mumei2018 发表于 2024-2-18 12:25:03

FishC 发表于 2024-2-18 12:23
实体类中的校验注解不生效的原因可能有以下几种:

1. 未设置校验配置:为了使校验注解生效,需要在项目 ...


【求助帖】请及时确认最佳答案,下次提问时可以得到更多关注,问题可以更快解决
请问实体类里的校验注解不生效是什么原因
/bigEventB/src/main/java/com/ms/bigEventB/pojo/User.java 路径下 实体类代码如下

package com.ms.bigEventB.pojo;



import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

@Data
public class User {
      
      @NotNull
      private Integer id;//主键ID
    private String username;//用户名
    @JsonIgnore
    private String password;//密码
    @NotEmpty
    @Pattern(regexp = "^\\S{5,10}")
    private String nickname;//昵称
    @NotEmpty
    @Email
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}

FishC 发表于 2024-2-18 12:25:23

mumei2018 发表于 2024-02-18 12:25
【求助帖】请及时确认最佳答案,下次提问时可以得到更 ...

根据您提供的实体类代码,我看到您使用了Jakarta Bean Validation API中的注解来进行校验。校验注解不生效可能有以下原因:

1. 缺少校验依赖:请确保您的项目已经引入了Jakarta Bean Validation API的依赖。通常可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>2.0.2</version>
</dependency>

2. 缺少校验实现:除了引入Bean Validation API的依赖外,还需要引入一个校验实现库,例如Hibernate Validator。您可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>7.0.1.Final</version>
</dependency>

3. 未启用校验:请确保您的Spring Boot应用已经启用了校验功能。可以在配置文件(application.yml或application.properties)中添加以下配置:

spring.mvc.validation.enabled=true

4. 校验器未被触发:请检查在什么情况下校验器未被触发。例如,如果您在控制器方法参数上使用了@Validated注解,但是没有传递一个实体对象给校验器,则校验器将不会被触发。

请检查以上几个方面,如果问题仍然存在,请提供更多的代码和错误信息以供进一步分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 请问实体类里的校验注解不生效是什么原因