我的实体中有一个包含电话号码的字段。根据项目的约定,我需要将其以E.164格式保存在数据库中。目前,我使用@PrePersist和@PreUpdate批注将电话号码更改为指定的格式。此方法对一个或两个实体很有用,但是当您需要反复重复此方法时,它很容易出错。
我当时想,如果我可以将代码放入批注中,并且批注读取字段并在持久性之前更改@LastModifiedDate和批注之类的值,则它会改变其值。我在网上搜索了此批注的代码,但我不明白他们如何管理它。
我如何编写一个在持久化之前读取字段值并对其进行更改的注释,以及如何在诸如delete(我也想在删除该对象之前设置一些参数)之类的某些特定操作之前进行注释
答案 0 :(得分:2)
您可以创建一个侦听器,以检查您的自定义注释并触发适当的方法。
@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;
这将适用于任何类型,而不仅仅是字符串。
抱歉,这有点令人费解,我在重新学习自己时很开心。