Я сериализую некоторые существующие объекты с помощью Jackson 2.22, используя функцию MixIn, чтобы отделить реальный объект от конфигурации аннотаций Jackson.Как добавить производные свойства в сериализованный класс Jackson 2?
На самом деле мой mixin - это интерфейс, который объявляет те же методы целевого класса и аннотирует их, вот пример.
Целевой класс:
public class Product {
// ...
public String getName();
public String getDescription();
public String getPrice();
public String getFinalPrice();
public String getDiscount();
// ...
}
и Mixin:
public interface ProductApi {
@JsonProperty
public String getName();
@JsonProperty("price")
public String getFinalPrice();
}
Мой JSON должен иметь больше некоторую информацию, вычисленная из нескольких методов или полей целевого класса.
Возможно ли это в Джексоне?
Я попытался превратить mixin в класс и добавив новый метод там, но это не сработало.
public class ProductApi {
@JsonProperty
public String getName();
@JsonProperty("price")
public String getFinalPrice();
@JsonProperty("images")
public List<String> getImages() { /* ... */ }
}
Я думаю, это потому, что Mixin только обеспечивает аннотации для целевого класса, но тот, который читается для сериализации.
Конечно, если я изменю объект для сериализации с новым подклассом, который содержит новый метод, который мне нужен, это работает, но объекты поступают из наших слоев служб, и это будет означать, что я должен переписать все эти методы ,
Я использую Джексона с Джерси, поэтому не хочу менять Джексона с другой библиотекой.
поэтому, если я понимаю, вы передаете экземпляр 'Product' в ObjectMapper и потому, что' Product' реализует 'ProductApi', то ObjectMapper читает аннотации оттуда –
@sharonbn. Вся история заключается в том, что' Product' возвращается внутри пользовательский объект, инкапсулированный в JAX-RS [объект ответа] (http://jax-rs-spec.java.net/nonav/2.0/apidocs/javax/ws/rs/core/Response.html), сериализация которого опосредована пользовательским «ObjectMapper», предоставляемым [ContextResolver] (https://jax-rs-spec.java.net/nonav/2.0/apidocs/index.html?javax/ws/rs/core/Configurable.html), который настраивает его с помощью mixin, но да, вот что в итоге происходит :-) – watery