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

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

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

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

其中MessageContext是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”)。

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

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

一种方法是抛出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(); } } 

我不确定这是不是最好的方法,但我已经做了以下工作来解决你的问题#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

您可以编写自己的响应filter来更改内容类型标头。

 @Provider public class MimeAddingFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { responseContext.getHeaders().add("Content-Type", "image/png"); } } 

此filter将添加“image / png”内容类型标头。 您还可以在JAX-RS响应filter中更改或删除标头。