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最后要做的事情之一。因此,首先筛选,而不是编组。。。