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

2022-09-03 00:03:45

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

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

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

其中消息上下文为 。org.apache.cxf.jaxrs.ext.MessageContext

我试图完成的两件事,我似乎无法弄清楚:

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

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

HttpServletResponse response = req.getHttpServletResponse();
response.setContentType("text/plain")
response.setStatus("HttpServletResponse.SC_BAD_REQUEST);

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

我返回一个简单的字符串作为正文。我一直试图返回javax.ws.rs.core.Response对象来做我想做的事情,但我对它知之甚少。

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


答案 1

一种方法是抛出一个WebApplicationException,如Pace所述,如果您希望专门处理错误情况,它将起作用。如果您希望能够出于任何原因随时更改内容,那么您需要查看将响应作为服务方法的结果而不是字符串返回。通过返回响应,您可以最大程度地控制服务如何响应客户端请求(与返回简单字符串相比,它确实需要更多的代码)。

下面是如何利用 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();
    }    
}

答案 2

我不确定这是否是最好的方法,但我已经做了以下事情来解决您的问题#1。

public WebApplicationException createStatusException(String statusMessage) {
    ResponseBuilder rb = Response.noContent();
    rb = rb.type(MediaType.TEXT_PLAIN);
    rb = rb.status(Status.BAD_REQUEST);
    rb = rb.entity(statusMessage);
    return new WebApplicationException(rb.build());
}

编辑:然后我扔了结果。WebApplicationException