在jax-rs REST服务中更改内容类型

Ind*_*ity 15 java rest web-services

请原谅我,但我可能不熟悉正确提出这个问题所需的所有术语.

我正在使用org.apache.cxf.jaxrs.extjax-rs 的实现在Java中开发一个相当简单的REST Web服务.方法标题如下:

@GET
@Path("json/{fullAlias}")
@Produces({"application/json"})
public String json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req)
Run Code Online (Sandbox Code Playgroud)

MessageContext的位置org.apache.cxf.jaxrs.ext.MessageContext.

有两件事我想要完成,我似乎无法弄清楚:

  1. 如果满足某些条件,则更改内容类型(例如,出错)
  2. 更改响应的状态代码

我试过通过MessageContext访问它来改变响应:

HttpServletResponse response = req.getHttpServletResponse();
response.setContentType("text/plain")
response.setStatus("HttpServletResponse.SC_BAD_REQUEST);
Run Code Online (Sandbox Code Playgroud)

但这些变化与发送的响应无关; 无论有没有@Produces注释,在方法内设置内容类型都不会影响实际内容类型(使用注释时,它当然会返回"application/json",而不会默认为"text/html").

我正在返回一个简单的String作为正文.我试图返回一个javax.ws.rs.core.Response对象来做我想做的事,但我不太了解它.

如何从此方法中更改内容类型和/或状态代码?

Kri*_*bic 31

一种方法是抛出WebApplicationException,如Pace所描述的,如果您希望专门处理错误条件,它将起作用.如果您希望能够出于任何原因随时更改您的内容,那么您将需要查看作为服务方法而不是String的结果返回Response.返回响应可以让您对服务如何响应客户端请求进行最大程度的控制(它需要的代码多于返回简单字符串所需的代码).

以下是如何使用Response对象的示例:

@GET
@Path("json/{fullAlias}")
public Response json(@PathParam("fullAlias") String fullAlias, @Context MessageContext req) {
    ...
    if (success) {
        ResponseBuilder rBuild = Response.ok(responseData, MediaType.APPLICATION_JSON);
        return rBuild.build();
    }
    else {
        ResponseBuilder rBuild = Response.status(Response.Status.BAD_REQUEST);
        return rBuild.type(MediaType.TEXT_PLAIN)
                     .entity("error message")
                     .build();
    }    
}
Run Code Online (Sandbox Code Playgroud)