Использование аннотаций в весенней загрузке для представления данных в правильном формате - PullRequest
0 голосов
/ 20 сентября 2019

В моей сущности есть поле с номером телефона.Согласно соглашениям проекта, мне нужно сохранить его в формате E.164 в БД.В настоящее время я использую аннотации @PrePersist и @PreUpdate для изменения телефонного номера на указанный формат.Этот метод хорош для одной или двух сущностей, но он становится очень подверженным ошибкам, когда вам приходится повторять его снова и снова.

Я думал, что было бы здорово, если бы я мог поместить код в аннотацию ианнотация читает поля и изменяет их значение непосредственно перед сохранением, что-то вроде того, что делают @LastModifiedDate и annotation.Я искал в Интернете коды этой аннотации, но я не понял, как им это удалось.

Как написать аннотацию, которая считывает значение поля и изменяет его перед сохранением, и как я могу это сделатьсделать это перед некоторыми конкретными операциями, такими как удаление (я хочу установить некоторые параметры перед удалением объекта тоже)

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Взгляните на 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 голос
/ 21 сентября 2019

@Pattern - довольно мощная аннотация, которая хорошо подойдет для проверок, если у вас есть опыт работы с регулярными выражениями.

Например,

@Pattern(regexp="^[0-9]{3}-[0-9]{3}-[0-9]{4}$")
private String phoneNumber;

Недостатком является то, что этоработает только для строк, хотя.

Если вас интересует больше конверсий, чем проверок, вы можете обратиться к @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(".*", "");
            }
        }
    }
}

Это будет работать для любого типа, а не только для струн.

Извините, это немного запутанно, я получал удовольствие, переучивая себя.

...