2016-02-16 19 views
5

“seçilebilir varlık filtrelemesini” yerleştirmeye çalışırken bir sorunum var.Jersey Jackson veri öğesi filtreleme JsonMappingException koleksiyona

// 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); 

... ..

tüm güzel çalışıyordu “filtreleme seçilebilir varlık” kayıt önce, bir sürü olduğunu test: Ben bir tane aşağıdaki gibi bir Özet sınıf var.

Ve şu hata var “seçilebilir varlık filtreleme” kaydettikten sonra

:

[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) 

filtreleme etkinleştirildiğinde neden sorun anlamıyorum

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; 
    } 

geldiğini görünüyor POST isteklerinde bile mi? Garip olan şey, istekte “select” sorgu parametresini koymadım! Yardım edebilir misiniz?

+0

Jackson ekibi bir Jersey sorunu olduğunu söylüyor. https://github.com/jersey/jersey/issues/3574 – ChrisO

cevap

5

Size SelectableEntityFilteringFeature kullanarak ve zaman sen Tepki bir bütünlük olarak Collection koyarak varsa o zaman bir JsonMappingException alacak gibi görünüyor. Benim için bu bir hatadır. Buradaki çalışma, Jersey-Jackson tarafından serileştirilebilmesi için koleksiyonunuzu GenericEntity içine eklemelisiniz.

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

Teşekkürler! Bu çok kullanışlı. Ama ne yazık ki koleksiyon kök nesnesi değilse işe yaramıyor. https://java.net/jira/browse/JERSEY-2933 Şahsen denedim ve çok tuhaf davranışlara geri dönüyorum. Bir Jersey-Jackson hatası olduğunu biliyorum, @ user3774109 çözünürlükte herhangi bir şans? – aheryan

+0

'jersey' git'e ilerledikçe, yukarıdaki 'JERSEY-2933' bir [github] (https://github.com/jersey/jersey/issues/3205) sorunudur. Toplama kök nesnesi olsa bile, –

+0

GenericEntity'de sarma işlemi benim için çalışmadı – ChrisO

0

Ben SecurityEntityFilteringFeature kullanıyorum, ben de aynı hataya üzerine koştu.

StdSerializer.findPropertyFilter.getFilterProvider ve StdSerializer.findPropertyFilter, null döndürüyor.

Benim çözüm:

@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); 
     } 
    }); 
} 

}

İlgili konular