向实体类提供 Java 时钟以进行 Spring 验证

pbu*_*eit 1 java validation spring datetime entity

我正在开发一个 spring-boot 应用程序。我有一个名为 Message 的实体类,我想使用 Spring 验证对其进行验证。我需要验证的字段之一是 LocalDateTime,它不得早于当前日期 6 天。我的实体类如下所示:

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Message implements Validator {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", length = 100, nullable = false, unique = true)
    private long id;

    @Column(name = "start", length = 20, nullable = true)
    private LocalDateTime start;

    public Message() {}

    @Override
    public boolean supports(@NotNull Class<?> clazz) {
        return Message.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Message m = (Message) target;

        if(m.getStart() != null && m.getStart().isBefore(LocalDateTime.now(clock).minusDays(6)))
        {
            errors.rejectValue("start", "beforeMinStart");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我希望能够为验证提供时钟,以便我可以使用固定的日期时间进行测试。我不能简单地使用构造函数;该消息可能来自数据库查找。我更喜欢使用依赖注入,但我不确定它如何与实体类一起使用。有什么方法可以做到这一点我只是没有看到吗?

Jor*_*orn 6

将实体类和验证器类分开:

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Message {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", length = 100, nullable = false, unique = true)
    private long id;

    @Column(name = "start", length = 20, nullable = true)
    private LocalDateTime start;

    public Message() {}
}

public class MessageValidator implements Validator {
    @Autowired private Clock clock;

    @Override
    public boolean supports(@NotNull Class<?> clazz) {
        return Message.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Message m = (Message) target;

        if(m.getStart() != null && m.getStart().isBefore(LocalDateTime.now(clock).minusDays(6)))
        {
            errors.rejectValue("start", "beforeMinStart");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以自动装配任何您想要的依赖项。