3 回答

TA贡献1818条经验 获得超3个赞
凭空回答可以解决问题,但是它修改了整个方法,让诸如Jackson + JAXB之类的提供程序自动将您返回的对象转换为某种输出格式(如JSON)。受Apache CXF 帖子(使用特定于CXF的类)的启发,我发现了一种设置应在任何JAX-RS实现中都可以使用的响应代码的方法:注入HttpServletResponse上下文并手动设置响应代码。例如,以下是CREATED在适当时将响应代码设置为的方法。
@Path("/foos/{fooId}")
@PUT
@Consumes("application/json")
@Produces("application/json")
public Foo setFoo(@PathParam("fooID") final String fooID, final Foo foo, @Context final HttpServletResponse response)
{
//TODO store foo in persistent storage
if(itemDidNotExistBefore) //return 201 only if new object; TODO app-specific logic
{
response.setStatus(Response.Status.CREATED.getStatusCode());
}
return foo; //TODO get latest foo from storage if needed
}
改进:找到另一个相关答案后,我了解到HttpServletResponse即使对于单例服务类(至少在RESTEasy中),也可以将其作为成员变量注入!!与用实现细节污染API相比,这是一种更好的方法。它看起来像这样:
@Context //injected response proxy supporting multiple threads
private HttpServletResponse response;
@Path("/foos/{fooId}")
@PUT
@Consumes("application/json")
@Produces("application/json")
public Foo setFoo(@PathParam("fooID") final String fooID, final Foo foo)
{
//TODO store foo in persistent storage
if(itemDidNotExistBefore) //return 201 only if new object; TODO app-specific logic
{
response.setStatus(Response.Status.CREATED.getStatusCode());
}
return foo; //TODO get latest foo from storage if needed
}
添加回答
举报