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