在Spring Boot中使用注释以正确的格式放置数据

时间:2019-09-20 15:38:27

标签: spring-boot annotations

我的实体中有一个包含电话号码的字段。根据项目的约定,我需要将其以E.164格式保存在数据库中。目前,我使用@PrePersist和@PreUpdate批注将电话号码更改为指定的格式。此方法对一个或两个实体很有用,但是当您需要反复重复此方法时,它很容易出错。

我当时想,如果我可以将代码放入批注中,并且批注读取字段并在持久性之前更改@LastModifiedDate和批注之类的值,则它会改变其值。我在网上搜索了此批注的代码,但我不明白他们如何管理它。

我如何编写一个在持久化之前读取字段值并对其进行更改的注释,以及如何在诸如delete(我也想在删除该对象之前设置一些参数)之类的某些特定操作之前进行注释

2 个答案:

答案 0 :(得分:2)

看看EntityListeners

您可以创建一个侦听器,以检查您的自定义注释并触发适当的方法。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TheCustomAnnotation{
}
@Entity
@EntityListeners(TheListener.class)
public class TheEntity {

    @TheCustomAnnotation
    private String phoneNumber;


public class TheListener {

    @PrePersist
    public void prePersist(Object target) {
        for(Field field : target.getClass().getDeclaredFields()){
          Annotation[] annotations = field.getDeclaredAnnotations();
          // Iterate annotations and check if yours is in it.
        }
    }

这只是一个例子。

答案 1 :(得分:1)

const STOP = 1 const START = 2 const ERROR = 3 是一个非常强大的注释,如果您有正则表达式的经验,则非常适合进行验证。

例如,

@Pattern

缺点是虽然这仅适用于字符串。

如果您对转换的兴趣多于验证,那么如果您使用杰克逊,则可能要研究@Pattern(regexp="^[0-9]{3}-[0-9]{3}-[0-9]{4}$") private String phoneNumber;

例如:

@JsonDeserialize
@JsonDeserialize(using=PhoneNumberDeserializer.class)
private String phoneNumber;

这将适用于任何类型,而不仅仅是字符串。

抱歉,这有点令人费解,我在重新学习自己时很开心。