Могу ли я использовать Jackson MixIns для изменения поведения «получателей»? - PullRequest
3 голосов
/ 08 ноября 2011

Мне нужно очистить некоторые невидимые символы (\ r \ n) и теги html для определенных методов получения на моих объектах.

Я пытался использовать mixIns для изменениячто возвращается от объекта, но я не уверен, как я могу ссылаться на целевой класс в моем MixIn, чтобы я мог добавить логику очистки там.Из моих тестов кажется, что даже не мой метод называется.

Это то, что я имею до сих пор, но его никогда не называют

public abstract class BookMixIn {
@JsonProperty
public String getTitle() {
    return StringUtils.deleteWhitespace(getTitle());
}
}

public class Book {
    private String title;
    // getter/setters omitted...
}

И конфигурация ObjectMapper:

mapper.getSerializationConfig().addMixInAnnotations(com.company.Book.class, 
                                                    com.company.BookMixIn.class);  
mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);  
String tmp = mapper.writeValueAsString(book);
log.info(tmp);

Можно ли это сделать через MixIns?

Спасибо

Ответы [ 3 ]

4 голосов
/ 08 ноября 2011

дополнения Джексона предназначены исключительно для связывания аннотаций;они не используются для добавления поведения (кода).Таким образом, они вам здесь не помогут.

Но простой способ, который будет работать (возможно, и с использованием mix-in), - это добавить аннотацию для использования собственного сериализатора, который может использовать любую фильтрацию, необходимую:1004 *

так что либо добавьте это в POJO, если это возможно;но если нет, свяжите это с помощью mix-in.

4 голосов
/ 04 февраля 2012

Если вы используете Джексон 1.9, это работает:

BookCleaner cleanBook = new BookCleaner(book);
mapper.getSerializationConfig().addMixInAnnotations(Book.class, BookMixIn.class);
mapper.writeValueAsString(cleanBook);

@JsonSerialize
class BookCleaner {
    private Book book;

    public BookCleaner(final Book book) { this.book = book; }

    @JsonUnwrapped
    public Book getBook() { return book; }

    @JsonProperty("title") 
    public String getCleanTitle() { return cleanup(getBook().getTitle()); }
}

public interface BookMixIn {
    @JsonIgnore public String getTitle();
}
2 голосов
/ 08 ноября 2011

Я не думаю, что это работает так;класс или интерфейс просто используются в качестве подписи.

Вы можете использовать AspectJ для изменения возвращаемого значения, но может быть проще просто создать декоратор и сериализовать его вместо базового объекта.

Кроме того, вы можете создать специальные геттеры для «безопасных» версий вещей и использовать аннотацию @JsonProperty, чтобы дать нужное вам имя, и использовать @JsonIgnore в «небезопасных» геттерах.

...