我可以使用jackson mixIns修改“getters”行为吗?

时间:2011-11-07 22:40:53

标签: java jackson mixins

我需要为我的实体上的特定吸气剂清理一些不可见的字符(\ 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 个答案:

答案 0 :(得分:4)

杰克逊混音纯粹用于关联注释;它们不用于添加行为(代码)。 所以他们不会帮助你。

但是可行的简单方法(可能也使用混合)是添加注释以使用自定义序列化程序,它可以使用任何需要的过滤:

@JsonSerialize(using=MyCoolSerializer.class) public String getTitle() { }

所以要么将其添加到POJO,如果可能的话;但如果没有,请使用混合来关联它。

答案 1 :(得分:4)

如果您正在运行Jackson 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 :(得分:2)

我不认为它是这样的;类或接口仅用作签名。

您可以使用AspectJ来修改返回值,但是创建一个装饰器并序列化它而不是底层对象可能更容易。

或者,您可以为“安全”版本的内容创建特定的getter,并使用@JsonProperty注释为其指定所需名称,并在“非安全”getter上使用@JsonIgnore