【问题标题】:Jersey Jackson data entity filtering JsonMappingException on collection泽西杰克逊数据实体过滤集合上的 JsonMappingException
【发布时间】:2016-02-16 16:03:03
【问题描述】:

我在尝试实施“可选实体过滤”时遇到问题。我有一个像下面这样的抽象类:

   // In your Pom
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-entity-filtering</artifactId>
    </dependency>
....

    //Somewhere in resourceConfig: Register entity-filtering selectable feature.
    register(SelectableEntityFilteringFeature.class);
    property(SelectableEntityFilteringFeature.QUERY_PARAM_NAME, "select");

    register(JacksonFeature.class);

…..

在注册“可选实体过滤”之前一切正常,我测试了很多。

注册“可选实体过滤”后出现以下错误:

[2016-02-15 17:25:36] - DEBUG EntityMapper:116 [http-bio-8080-exec-3] Preparing query INSERT INTO 
[2016-02-15 17:25:43] - ERROR JsonMappingExceptionMapper:29 [http-bio-8080-exec-3] Malformed Json!
com.fasterxml.jackson.databind.JsonMappingException: Can not resolve  PropertyFilter with id 'java.util.HashMap'; no FilterProvider configured
  at   com.fasterxml.jackson.databind.ser.std.StdSerializer.findPropertyFilter(StdSerial izer.java:285)
  at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:459)
  at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:29)
  at  com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:129)
  at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:851)
  at com.fasterxml.jackson.jaxrs.base.ProviderBase.writeTo(ProviderBase.java:650)
  at org.glassfish.jersey.jackson.internal.FilteringJacksonJaxbJsonProvider.writeTo(FilteringJacksonJaxbJsonProvider.java:135)
  at    org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)
   at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
  at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
  at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:106)
  at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
  at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:86) 

看来问题出在

  StdSerializer.findPropertyFilter(StdSerializer.java:285)
  protected PropertyFilter findPropertyFilter(SerializerProvider provider,
        Object filterId, Object valueToFilter)
     throws JsonMappingException
  {
     FilterProvider filters = provider.getFilterProvider();
     // Not ok to miss the provider, if a filter is declared to be needed.
     if (filters == null) {
         throw new JsonMappingException("Can not resolve PropertyFilter with id '"+filterId+"'; no FilterProvider configured");
     }
     PropertyFilter filter = filters.findPropertyFilter(filterId, valueToFilter);
     // But whether unknown ids are ok just depends on filter provider; if we get null that's fine
    return filter;
  }

我不明白为什么即使在 POST 请求中也会激活过滤?奇怪的是我没有在请求中放入“select”查询参数! 你能帮忙吗?

【问题讨论】:

标签: json jackson jersey-2.0


【解决方案1】:

似乎当您使用 SelectableEntityFilteringFeature 并且将 Collection 作为实体放入响应中时,您将获得 JsonMappingException。对我来说,这是一个错误。解决方法是您应该将您的集合封装到 GenericEntity 中,以便能够被 Jersey-Jackson 序列化。

return Response.status(Status.OK)
       .entity(new GenericEntity<Set<MyEntity>>(entityIDs)     {}).build(); 
// Use GenericEntity to avoid JsonMappingException  because of the new flow with Filtering

【讨论】:

  • 谢谢!这非常有用。但不幸的是,如果集合不是根对象,它就不起作用。 java.net/jira/browse/JERSEY-2933我亲自尝试过,我确实得到了非常奇怪的行为。我知道这是一个 Jersey-Jackson 错误,@user3774109 解决方案好运吗?
  • jersey 移至 git,JERSEY-2933 以上是github 问题。
  • 包装在 GenericEntity 中对我不起作用,即使集合是根对象
【解决方案2】:

我使用的是SecurityEntityFilteringFeature,但遇到了同样的错误。

StdSerializer.findPropertyFilter.getFilterProviderStdSerializer.findPropertyFilter 正在返回 null

我的解决办法是:

@Provider
public class JsonMappingExceptionOnCollectionResponseFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestCtx, ContainerResponseContext responseCtx) throws IOException {
    ObjectWriterInjector.set(new ObjectWriterModifier() {

        @Override
        public ObjectWriter modify(EndpointConfigBase<?> endpoint, MultivaluedMap<String, Object> responseHeaders, Object valueToWrite, ObjectWriter w, JsonGenerator g) throws IOException {
            SimpleFilterProvider filterProvider = new SimpleFilterProvider();
            SimpleBeanPropertyFilter simpleBeanPropertyFilter = new SimpleBeanPropertyFilter() {
                @Override
                protected boolean include(BeanPropertyWriter writer) {
                    return true;
                }

                @Override
                protected boolean include(PropertyWriter writer) {
                    return true;
                }
            };
            filterProvider.addFilter("your entity class", simpleBeanPropertyFilter);
            filterProvider.addFilter("your entity class", simpleBeanPropertyFilter);
            return w.with(filterProvider);
        }
    });
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2012-09-17
    • 2015-10-19
    • 2012-06-07
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多