#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. Я протестировал это сейчас, и это работает! Спасибо за помощь 🙂