2017-06-28 2 views
1

Je souhaite activer les fonctions de compression sur le maillot. J'ai un webservice qui doit retourner une liste d'événements sur le format json. Pour exemple:Problèmes de compression gzip avec le maillot

{ 
    "page": 1, 
    "pageCount": 1, 
    "list": [ 
    { 
     "pk": 1, 
     "state": "ACTIVE", 
     "locationType": "ADDRESS", 
     "title": "titre", 
     "description": "hello", 
     "country": "osef", 
     "city": "osef", 
     "address": "osef", 
     "inAgendaCount": 0, 
     "dateBeginning": 1498734400758 
    } 
    ] 
} 

Mais quand j'activer la compression gzip, la réponse est comme ceci:

{ 
    "page": 1, 
    "pageCount": 1, 
    "list": [ 
    { 
    } 
    ] 
} 

Tous les événements dans la liste sont coupées. Voici mon webservice:

@Component 
@Path("/") 
public class EventSearchWebService { 

    @Autowired 
    private EventSearchController controller; 

    @GET 
    @Path("/event/search") 
    @Produces(MediaType.APPLICATION_JSON) 
    @JsonView(SmallView.class) 
    public Response search(@QueryParam("keywords") String keywords, @DefaultValue("1") @QueryParam("page") Long page) { 

     if (keywords != null && !keywords.trim().isEmpty()) { 
      return Response.status(200).entity(controller.search(keywords, page)).build(); 
     } else { 
      return Response.status(200).entity(controller.search(page)).build(); 
     } 
    } 
} 

Mon ResourceConfig avec compression:

@Configuration 
@ApplicationPath("/rest") 
public class JerseyConfig extends ResourceConfig { 

    public JerseyConfig() { 
     // Compression 
     register(EntityFilteringFeature.class); 
     EncodingFilter.enableFor(this, GZipEncoder.class); 

     register(EventSearchWebService.class); 

     register(MultiPartFeature.class); 
     register(ValidationFeature.class); 
     register(ValidationExceptionMapper.class); 
     register(CrossDomainContainerResponseFilter.class); 

     registerClasses(AccessDeniedExceptionMapper.class, 
       GeneralUserExceptionMapper.class, 
       NoResultExceptionMapper.class, 
       UnknowExceptionMapper.class, 
       ValidationExceptionMapper.class); 
    } 
} 

Et ma classe pageableList:

public class PageableList<E> { 

    @Getter 
    @Setter 
    @JsonView(value = {SmallView.class, FullView.class}) 
    private long page; 

    @Getter 
    @Setter 
    @JsonView(value = {SmallView.class, FullView.class}) 
    private long pageCount; 

    @Getter 
    @Setter 
    @JsonView(value = {SmallView.class, FullView.class}) 
    private List<E> list; 

    public PageableList() { 
     super(); 
    } 

    public PageableList(List<E> list) { 
     super(); 
     this.list = list; 
    } 
} 

Il n'y a pas d'erreur dans les journaux. Y a-t-il quelqu'un qui a une idée de ce qui se passe?

Merci

EDIT: après de nouvelles recherches, je trouve que si j'envoie directement ma liste d'événements sans PageableList, j'ai l'erreur:

Can not resolve PropertyFilter with id 'org.vagrant.server.entity.EventEntity'; no FilterProvider configured (through reference chain: java.util.ArrayList[0]) 

Répondre

0

Le problème était dans le ResourceConfig. Cette ligne:

register(EntityFilteringFeature.class); 

est inutile et provoquer le bug.