Java 自定义内容协商处理扩展和带有Jersey的“Accept”标题
我简化了这个资源:Java 自定义内容协商处理扩展和带有Jersey的“Accept”标题,java,rest,jersey,Java,Rest,Jersey,我简化了这个资源: @Path("/cars{extension:(\\.(xml|json))?}") public class Cars { @GET @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Response searchCars(@PathParam("extension") String extension) { System.out.pr
@Path("/cars{extension:(\\.(xml|json))?}")
public class Cars {
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response searchCars(@PathParam("extension") String extension) {
System.out.println("extension: " + extension);
//...
return Response.status(200).entity(output).build();
}
}
例如,我想,但是业务逻辑可能会改变,如果扩展是xml,则返回xml响应;如果扩展是Json,则返回Json,无论头Accept是什么。
问题是,默认情况下,我希望使用Accept标头,但假设某个虚拟用户希望使用Ajax访问我的web服务,但对标头了解不多,我只想通过添加适当的扩展为他简化工作。
有了这个片段,如果有扩展,我就可以得到它,但我不知道如何相应地改变策略
谢谢
编辑:
所以我找到了一些东西,我可以使用。从Response.ResponseBuilder键入,如:
Response.ResponseBuilder responseBuilder = Response.status(200).entity(output);
if ([some test about extention or header])
responseBuilder.type(MediaType.APPLICATION_XML);
// other tests
我不知道这是否是正确的方法,但这意味着我需要为所有路径处理它…我将为此使用ContainerResponseFilter,因此您不必为每个路径都执行此操作
首先检查扩展名——也就是虚拟人喜欢的媒体类型
然后检查您的服务是否可以接受请求的MediaType。如果不是的话,我会说这个笨蛋运气不好
示例代码[jersey 2.x]:
导入java.io.IOException;
导入java.lang.annotation.annotation;
导入java.util.List;
导入javax.ws.rs.container.ContainerRequestContext;
导入javax.ws.rs.container.ContainerResponseContext;
导入javax.ws.rs.container.ContainerResponseFilter;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.ext.Provider;
@提供者
公共类EntityResponseFilter实现ContainerResponseFilter{
@凌驾
公共无效筛选器ContainerRequestContext请求,ContainerResponseSecontext resc引发IOException{
MediaType MediaType=this.GetMediaTypeFromExtensionOrHeader;//TODO
List mediaTypes=reqc.getAcceptableMediaTypes;
如果mediaTypes.containsmediaType{
resc.setEntity resc.getEntity,新注释[0],mediaType;
}
// ...
}
}
希望这能有所帮助:谢谢你的回答。顺便说一句,哑巴不是轻蔑的;-所以,它与过滤器一起工作,我让它与父类一起工作,为我的资源处理这些内容。关于filter和ContainerResponseContext的一个问题,就性能而言,我想确保在调用资源后,在对实体进行第一次序列化之后,不会调用setEntity?你知道吗?更清楚地说,我想确保在筛选器之前不会发生序列化/封送处理。封送处理是jersey最后要做的事情之一。因此,首先筛选,而不是编组。。。