在 spring 引导中使用注释以正确格式放置数据
Using annotations in spring boot for putting data in correct format
我的实体中有一个字段包含 phone-number。根据项目的约定,我需要将它以E.164格式保存在DB中。目前我使用@PrePersist 和@PreUpdate 注释将 phone 数字更改为指定格式。这种方法对一个或两个实体很好,但是当你不得不一遍又一遍地重复它时,它变得非常容易出错。
我在想,如果我可以将代码放在注释中并且注释读取字段并在持久化之前更改其值,就像 @LastModifiedDate 和注释所做的那样,那会很棒。我在网上搜索了这个注释的代码,但我不明白他们是如何管理它的。
如何编写一个注释来读取字段的值并在持久化之前更改它,以及如何在某些特定操作(如删除)之前执行此操作(我也想在删除对象之前设置一些参数)
您可以创建一个侦听器来检查您的自定义注释并触发适当的方法。
@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.
}
}
这只是一个例子。
@Pattern
是一个非常强大的注释,如果您对正则表达式有经验,它非常适合验证。
例如,
@Pattern(regexp="^[0-9]{3}-[0-9]{3}-[0-9]{4}$")
private String phoneNumber;
缺点是这仅适用于字符串。
如果您对转换比验证更感兴趣,如果您使用的是 Jackson,则可能需要查看 @JsonDeserialize
。
例如:
@JsonDeserialize(using=PhoneNumberDeserializer.class)
private String phoneNumber;
Pattern phonePattern = Pattern.compile("^[0-9]{3}(.+)[0-9]{3}(.+)[0-9]{4}$");
public class PhoneNumberDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
String phone = jsonParser.getText();
if (matcher.matches(phone)) {
Matcher matcher = phonePattern.matcher(phone);
for (int i = 1; i < matcher.groupCount(); i++) {
marcher.group(i).replaceAll(".*", "");
}
}
}
}
这适用于任何类型,而不仅仅是字符串。
抱歉有点绕,我很高兴自学。
我的实体中有一个字段包含 phone-number。根据项目的约定,我需要将它以E.164格式保存在DB中。目前我使用@PrePersist 和@PreUpdate 注释将 phone 数字更改为指定格式。这种方法对一个或两个实体很好,但是当你不得不一遍又一遍地重复它时,它变得非常容易出错。
我在想,如果我可以将代码放在注释中并且注释读取字段并在持久化之前更改其值,就像 @LastModifiedDate 和注释所做的那样,那会很棒。我在网上搜索了这个注释的代码,但我不明白他们是如何管理它的。
如何编写一个注释来读取字段的值并在持久化之前更改它,以及如何在某些特定操作(如删除)之前执行此操作(我也想在删除对象之前设置一些参数)
您可以创建一个侦听器来检查您的自定义注释并触发适当的方法。
@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.
}
}
这只是一个例子。
@Pattern
是一个非常强大的注释,如果您对正则表达式有经验,它非常适合验证。
例如,
@Pattern(regexp="^[0-9]{3}-[0-9]{3}-[0-9]{4}$")
private String phoneNumber;
缺点是这仅适用于字符串。
如果您对转换比验证更感兴趣,如果您使用的是 Jackson,则可能需要查看 @JsonDeserialize
。
例如:
@JsonDeserialize(using=PhoneNumberDeserializer.class)
private String phoneNumber;
Pattern phonePattern = Pattern.compile("^[0-9]{3}(.+)[0-9]{3}(.+)[0-9]{4}$");
public class PhoneNumberDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
String phone = jsonParser.getText();
if (matcher.matches(phone)) {
Matcher matcher = phonePattern.matcher(phone);
for (int i = 1; i < matcher.groupCount(); i++) {
marcher.group(i).replaceAll(".*", "");
}
}
}
}
这适用于任何类型,而不仅仅是字符串。
抱歉有点绕,我很高兴自学。