REST实体过滤仅适用于单个实体而不适用于集合

时间:2014-05-11 21:33:29

标签: java json rest jersey jax-rs

我正在构建一个基于REST的应用程序,我想要部分JSON过滤器响应功能,例如,api.movi​​es.com/movies/1?fields=title,year将返回一个仅包含标题和生产年份的JSON id为1的电影。

经过大量的努力,我设法找到一个非常简单的解决方案,没有很多应该运行良好的依赖项,并且它适用于上面的情况,但如果REST服务返回集合而不是单个实体它不会工作,我debuged它,我可以过滤集合中的每个项目,但返回时我得到一个奇怪的例外,所以我将代码分到骨头,只剩下这个:

public class PartialResponseFilter implements ContainerResponseFilter {
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        System.out.println("Response filter");
        Object entity = responseContext.getEntity();
        responseContext.setEntity(entity);
}

它仍然无法正常工作,我是否遗漏了某些东西,或者这是Java上的错误?上面的代码确实适用于单个实体但不适用于集合,REST服务工作正常,问题在于拦截器。

我得到的例外是:

StandardWrapperValve[com.app.myApp.service.ApplicationConfig]: Servlet.service() for servlet com.app.myApp.service.ApplicationConfig threw exception
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class java.util.Vector, genericType=class java.util.Vector.
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:191)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
        at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
        at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)

修改

好的,我设法让它工作,但需要添加另一个依赖项,仍然让我感到厌烦的是,一组get抛出异常,而ContainerResponseContect的setEntity()仅适用于单个实体,但无论如何。

responseContext.setEntity((new Gson()).toJson(collection));

这就是诀窍。

0 个答案:

没有答案