在jax-rs REST服务中更改内容类型
问题内容:
请原谅我,但我可能不熟悉正确询问此问题所需的所有术语。
我正在使用org.apache.cxf.jaxrs.ext
jax-rs 的实现在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
。
我要完成的两件事似乎无法弄清:
- 如果满足某些条件(例如,出现错误),则更改内容类型
- 更改响应的状态码
我尝试通过通过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所述,如果您要专门处理错误情况,该方法将起作用。如果您希望由于任何原因能够随时更改内容,那么您将希望看看作为服务方法而不是字符串返回结果的响应。返回响应可以最大程度地控制服务对客户端请求的响应方式(与返回简单字符串相比,它确实需要更多代码)。
这是一个如何使用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();
}
}