新泽西州.如何根据url param生成json和xml输出

ses*_*ses 9 java xml json jaxb jersey

这是一项Jersey服务:

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response service(@QueryParam("format") String format) {

  if (format.equals("json")) {...}

  return response;

}
Run Code Online (Sandbox Code Playgroud)

我想根据url param "format" 生成XMLJSON回复.

我的回复实例正在形成jaxb2

我知道如果在我的Java客户端/功能测试中使用此代码,我可能会得到xmljson回复:

String content = service.path("").queryParam("myparam", "myvalue").accept(MediaType.APPLICATION_XML).get(String.class);
Run Code Online (Sandbox Code Playgroud)

要么

String content = service.path("").queryParam("myparam", "myvalue").accept(MediaType.APPLICATION_JSON).get(String.class);
Run Code Online (Sandbox Code Playgroud)

但我需要根据url param这样做.

use*_*600 13

这不是你想做的事情的正确方法.您不应使用查询参数来确定输出格式.您已声明您的资源方法同时生成XML和JSON,标准兼容的方法是让客户端发送正确的HTTP"Accept"标头,该标头声明它们能够使用哪种媒体类型.如果他们发送"Accept:application/json",您的JAX-RS实现应该选择将方法的响应格式化为JSON,如果客户端发送"Accept:application/xml",它应该自动将响应格式化为XML.如果客户端表明他们可以接受,那么您的JAX-RS实现可以自由选择,您也不应该关心.如果客户端表明他们也不能接受,那么您的JAX-RS应该发回适当的HTTP错误代码,表明他们没有办法发回适当的响应.


Mic*_*dos 5

您可以直接通过Response#ok(假设您要返回HTTP 200状态)方法设置响应实体的媒体类型

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response service(@QueryParam("format") String format) {
    return Response
            // Set the status, entity and media type of the response.
            .ok(entity, "json".equals(format) ? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML)
            .build();
}
Run Code Online (Sandbox Code Playgroud)

或使用Response.ResponseBuilder#header方法

@GET
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response service(@QueryParam("format") String format) {
    return Response
            // Set the status and Put your entity here.
            .ok(entity)
            // Add the Content-Type header to tell Jersey which format it should marshall the entity into.
            .header(HttpHeaders.CONTENT_TYPE, "json".equals(format) ? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML)
            .build();
}
Run Code Online (Sandbox Code Playgroud)