第一次使用杰克逊过滤器我很惊讶地发现它根本不起作用。这是我刚写的测试代码:
@Test
public void testJsonSerialization() throws JsonProcessingException {
Principal princi = Principal.builder().fullName("John Smith").role(Role.USER).build().setAccountType(CHILD)
.setClassAttended(Classes.C10);
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("fullName");
FilterProvider provider = new SimpleFilterProvider().addFilter("bareBonesFilter", filter);
JsonFilter jFilter = Principal.class.getAnnotation(JsonFilter.class);
assertNotNull(jFilter); // passes
assertEquals("bareBonesFilter", jFilter.value()); // passes
provider.findPropertyFilter("bareBonesFilter", princi); // doesn't throw exception, therefore a filter was found
ObjectWriter writer = (new ObjectMapper()).setSerializationInclusion(Include.NON_ABSENT)
.enable(SerializationFeature.INDENT_OUTPUT).writer(provider);
String json = writer.writeValueAsString(princi);
assertFalse(json.contains("accountType")); //this fails
}
使用Jackson 2.7.1。
我错过了什么?我是否需要在某处添加一些特殊配置才能使用过滤器?
我按照@StaxMan的建议尝试了2.7.9和2.9.4的上述代码,但没有人工作过。
然后我没有使用Principal
类(已经变大和复杂),而是使用更简单的SgEmailInfo
类(它只是一个数据持有者)尝试了上面的代码,并且过滤工作正常正如所料!
@Data
@Accessors(chain = true)
@JsonFilter("bareBonesFilter")
public class SgEmailInfo {
private long created;
private String email;
private String reason;
private String status;
}
@Data
和@Accessors
是用于自动生成某些代码的Lombok注释。 Principal
类也使用这些注释,但也使用其他Lombok注释:
@Entity //Objectify annotation
@Cache(expirationSeconds = 600) //Objectify annotation
@Data
@EqualsAndHashCode(of = "id", callSuper = false) // Lombok
@ToString(callSuper = true, doNotUseGetters = true, of = { "id", "firstName", "middleName",
"lastName", "profileName", "roles" }) // Lombok
@Accessors(chain = true)
@JsonFilter("bareBonesFilter")
public class Principal extends AccountEntity<Principal, EmailPrincipal>
implements Serializable, ProfileShort, ProfileMedium
我还在@JsonIgnore
的许多属性和getter上使用Principal
注释。
Principal
的构造函数上还有@Builder
注释:
@Builder
private Principal(String fullName, @Singular List<Role> roles)
Lombok生成的这些注释或代码是否会干扰过滤?
答案 0 :(得分:0)
代码对我来说似乎是合法的。在尝试使用更新的版本(以确保它不是一个已修复的错误)之后,您是否可以针对jackson-databind
提交错误?有可能我错过了上面代码的一些问题,但它没有什么非常明显的,所以它有可能是一个bug。