Объединение нескольких повторяющихся аннотаций - PullRequest
0 голосов
/ 02 мая 2018

У меня есть пара свойств json, которые должны обрабатываться несколькими анотациями

Исходя из лучших методик проектирования, нужно ли мне иметь несколько повторяющихся аннотаций (из стандартной библиотеки) или мне нужно создавать индивидуальные аннотации для их совместной обработки?

например, какая версия Beeter:

public class A{
    private static final String DATE_PATTERN = "yyyy-MM-dd";

    @JsonProperty
    private String name;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate date1;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate date2;



    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_PATTERN)
    @JsonDeserialize(using = LocalDateDeserializer.class)
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate rdate3;
}


public class B{


    @JsonProperty
    private String name;

    @customeDateFormatter
    private LocalDate date1;

    @customeDateFormatter
    private LocalDate date2;

    @customeDateFormatter
    private LocalDate rdate3;
}

где @customeDateFormatter определено в другом классе

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Зачем вообще аннотировать форматы и сериализаторы?

Джексон сделает это автоматически, если вы зарегистрируете модуль JSR310.

Proof

public class A {
    @JsonProperty private String name;
    @JsonProperty private LocalDate date1;
    @JsonProperty private LocalDate date2;
    @JsonProperty private LocalDate rdate3;

    public A() {
    }

    public A(String name, LocalDate date1, LocalDate date2, LocalDate rdate3) {
        this.name = name;
        this.date1 = date1;
        this.date2 = date2;
        this.rdate3 = rdate3;
    }

    @Override
    public String toString() {
        return "A [name=" + this.name + ", date1=" + this.date1 +
               ", date2=" + this.date2 + ", rdate3=" + this.rdate3 + "]";
    }

}
ObjectMapper mapper = new ObjectMapper()
        .registerModule(new JavaTimeModule()) // or: .findAndRegisterModules()
        .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
        ;

A a = new A("Foo", LocalDate.of(2000, 1, 1), LocalDate.now(), LocalDate.of(2999, 12, 31));
System.out.println(a);

String json = mapper.writeValueAsString(a);
System.out.println(json);

A a2 = mapper.readValue(json, A.class);
System.out.println(a2);

Выход

A [name=Foo, date1=2000-01-01, date2=2018-05-01, rdate3=2999-12-31]
{"name":"Foo","date1":"2000-01-01","date2":"2018-05-01","rdate3":"2999-12-31"}
A [name=Foo, date1=2000-01-01, date2=2018-05-01, rdate3=2999-12-31]
0 голосов
/ 02 мая 2018

Повторение себя считается плохой практикой по многим причинам, поэтому выбор версии с пользовательской аннотацией в этом примере является, очевидно, лучшим выбором. Однако это действительно имеет смысл, только если конфигурация всегда такая же, как в примере. Если пользовательскую аннотацию можно использовать только один или два раза, поскольку другие поля нуждаются в незначительных изменениях, тогда это может вообще не улучшиться.

...