Конструкторы для абстрактных классов не могут быть @Jacksonized (конструктор никогда не будет использоваться)

#java #jboss #jackson #wildfly #lombok

#java #jboss #джексон #wildfly #ломбок

Вопрос:

У меня есть два класса OAuth2Token и CachedOAuth2Token, которые расширяют класс с именем AbstractOAuth2Token.

AbstractOAuth2Token.java

 @SuperBuilder
@Jacksonized
@JsonSubTypes({
        @JsonSubTypes.Type(value = OAuth2Token.class),
})
@Getter
@Setter
@ToString
public abstract class AbstractOAuth2Token {
    @JsonProperty("access_token")
    private String accessToken;

    @JsonProperty("token_type")
    private String tokenType;
}
 

OAuth2Token.java

 @Getter
@Setter
@SuperBuilder
@ToString(callSuper = true)
@JsonTypeName("OAuth2Token")
@Jacksonized
public class OAuth2Token extends AbstractOAuth2Token {
    @JsonProperty("expires_in")
    private int expiresIn;
}
 

CachedOAuth2Token.java

 @Getter
@Setter
@SuperBuilder
@ToString(callSuper = true)
public class CachedOAuth2Token extends AbstractOAuth2Token {
    private LocalDateTime expirationDate;
}
 

К сожалению, мой проект Maven не создается, потому что AbstractOAuth2Token.java: Builders on abstract classes cannot be @Jacksonized (the builder would never be used).

Даже если код работает должным образом, если AbstractOAuth2Token не является абстрактным, тогда я могу создать его экземпляр с помощью builder, что на самом деле не то, что я хочу. Его конструктор защищен, поэтому проблем нет.

Идея в том, что я хочу, чтобы AbstractOAuth2Token был абстрактным, не теряя никакой функциональности в дочерних элементах. Я поклонник Lombok, поэтому я хочу иметь возможность использовать автоматически созданные конструкторы, но вместе с Jackson.

Это проект Wildfly 11 с Lombok 1.18.16

Как я могу решить эту проблему?

Ответ №1:

Не добавляйте @Jacksonized в свой abstract базовый класс. Не- @Jacksonized @SuperBuilder s совместимы с @Jacksonized @SuperBuilder s. Поскольку Jackson никогда не будет использовать AbstractOAuth2Token builder напрямую, нет необходимости настраивать его для Jackson явно.

Комментарии:

1. Я попробую это после того, как закончу свою текущую задачу и сообщу вам о результате

2. Я протестировал это сейчас, и это работает! Спасибо за помощь 🙂