无法让杰克逊过滤工作

时间:2017-12-21 06:35:19

标签: java json lombok jackson2

第一次使用杰克逊过滤器我很惊讶地发现它根本不起作用。这是我刚写的测试代码:

@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。

我错过了什么?我是否需要在某处添加一些特殊配置才能使用过滤器?

更新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生成的这些注释或代码是否会干扰过滤?

1 个答案:

答案 0 :(得分:0)

代码对我来说似乎是合法的。在尝试使用更新的版本(以确保它不是一个已修复的错误)之后,您是否可以针对jackson-databind提交错误?有可能我错过了上面代码的一些问题,但它没有什么非常明显的,所以它有可能是一个bug。