我正在构建一个基于REST的应用程序,我想要部分JSON过滤器响应功能,例如,api.movies.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));
这就是诀窍。