【问题标题】:com.fasterxml.jackson.databind.JsonMappingException: Can not resolve PropertyFilter with id 'filterProfile'; no FilterProvider configuredcom.fasterxml.jackson.databind.JsonMappingException:无法解析 ID 为“filterProfile”的 PropertyFilter;未配置 FilterProvider
【发布时间】:2017-10-25 13:21:03
【问题描述】:

我已经对我的 POJO(profile) 对象进行了动态过滤。过滤逻辑工作正常。需要将过滤后的对象作为响应返回。但是在返回配置文件对象时,在球衣层面临问题(MappableException)。

有人可以指导我吗?

过滤逻辑代码:

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    FilterProvider filters = new SimpleFilterProvider()  .addFilter("filterProfile",SimpleBeanPropertyFilter.serializeAllExcept(set1))
            .addFilter("filterUserDetails", SimpleBeanPropertyFilter.serializeAllExcept(set2)).setFailOnUnknownId(false);  

    ObjectWriter writer = mapper.writer(filters);
    try{            
       // Printing the filtered json object
        filteredJson = writer.writeValueAsString(profile);
    }

POJO:

@JsonFilter("filterProfile")

public class Profile {  

    @JsonProperty("session")
    private Session session;

错误:

引起:com.fasterxml.jackson.databind.JsonMappingException: 可以 不解析 ID 为“filterProfile”的 PropertyFilter;没有 FilterProvider 配置在 com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:312) 在 com.fasterxml.jackson.databind.ser.std.StdSerializer.findPropertyFilter(StdSerializer.java:441) 在 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFieldsFiltered(BeanSerializerBase.java:731) 在 com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:153) 在 com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292) 在 com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1429) 在 com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:951) 在 com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:625) 在 org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265) 在 org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250) 在 org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) 在 org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106) 在 org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)

【问题讨论】:

    标签: json jersey


    【解决方案1】:

    您的代码具有过滤序列化属性的意图,因此即使它没有抛出任何异常,过滤器也不会工作,因为它缺少这一行:

    mapper.addMixIn(Object.class, Profile.class);
    

    但是,您说“过滤逻辑工作正常”。考虑到这一点, 请发布一个重现问题的最低限度工作代码(可能是主要方法?)。

    【讨论】:

      【解决方案2】:

      下面的代码 sn-p 对我来说很好用

      ObjectMapper mapper = new ObjectMapper(); 
               mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
              SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept(set1);
              FilterProvider filterProvider = new SimpleFilterProvider().addFilter("filter", filter).setFailOnUnknownId(false);
              ObjectWriter writer = mapper.writer(filterProvider);
              String writeValueAsString = writer.writeValueAsString(profile);
              Profile resultProfile = mapper.readValue(writeValueAsString,Profile.class);
      

      注意:如果您不将 stringformat json 转换为 Profile。如代码 sn-p 的最后 2 行中所述,那么您的响应将按上述方式查看

      {\"name\":\"JPA in Use\",\"reviews\":[{\"id\...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 2014-09-16
        • 2020-07-19
        • 2019-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多