所以我try 在UserCreateRequest类中验证emailname,但@Wired不起作用,userRepository为空

UserCreateRequest.java:

@Getter
@Setter
@Component
public class UserCreateRequest {

    private UserRepository userRepository;

    public UserCreateRequest() {
    }

    @Autowired
    public UserCreateRequest(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @NotBlank(message = "Name is mandatory")
    @Size(min = 2, max = 20, message = "Name should be between 2 and 20 characters")
    private String name;


    @NotBlank(message = "Email is mandatory")
    @Email(message = "Email should be valid")
    private String email;

    @NotNull(message = "Date of birth is mandatory")
    @DateFormatRule(message = "Date of birth should be in yyyy-MM-dd format")
    private String dob;

    public User validated() {
        if (userRepository.findUserByEmail(email).isPresent()) {
            throw new RuntimeException("Email already exists");
        }
        if (userRepository.findUserByName(name).isPresent()) {
            throw new RuntimeException("Name already exists");
        }


        User user = new User();
        user.setName(name);
        user.setEmail(email);
        user.setDob(LocalDate.parse(dob));

        return user;
    }
}

UserController.java:

@PostMapping
public ResponseEntity<User> addUser(@Valid @RequestBody UserCreateRequest userCreateRequest) {

    User validatedData = userCreateRequest.validated();

    User createdUser = this.userService.addUser(validatedData);

    return ResponseEntity.ok(createdUser);
}

发送请求时出现错误:

(ThreadPoolExecutor.java:659)\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\n\tat java.base/java.lang.Thread.run(Thread.java:1623)\n",
    "message": "Cannot invoke \"com.test.restapi.repository.UserRepository.findUserByEmail(String)\" because \"this.userRepository\" is null",
    "path": "/api/students"

我想判断数据库是否已经存在来自请求类的用户nameemail,而不是从控制器判断.

有没有办法像那样在UserCreateRequest班用userRepository

我找不到我正在寻找的确切解决方案

推荐答案

UserCreateRequest不是Spring管理的组件,它是通过将请求有效负载映射到类来创建的.你可以:

  1. 通过在控制器中注入上下文来手动自动存储库-只是不要这样做,您已经通过向dto添加业务逻辑(验证和映射)来混合职责.
  2. 创建要应用于字段-@UniqueName@UniqueEmail的验证注释.它们的验证器可以很容易地制成Spring管理的组件.

Java相关问答推荐

在现有Json文件中添加新记录

Gmail Javi API批量处理太多请求

如何在Javascript中设置文本区域圆角的样式

无法处理批处理侦听器中的反序列化异常

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

如何判断一个矩阵是否为有框矩阵?

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

在Java中,如何按一个属性升序,然后按另一个属性降序对对象列表进行排序?

如何在ApachePOI中将图像添加到工作表的页眉?

通过移动一个类解决了潜在的StubbingProblem.它怎麽工作?

测试何时使用Mockito强制转换对象会导致ClassCastException

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

EXCEL中的公式单元格显示#NAME?

Quarkus:运行时出现EnumConstantNotPresentException

通过Java列表中的某些字段搜索值

Java 21中泛型的不兼容更改

具有最大共同前景像素的图像平移优化算法

如何在Record Java中使用isRecord()和RecordComponent[]?

Cucumber java-maven-示例表-未定义一步

将基于实例编号的对象列表拆分为新的对象列表