3 回答

TA貢獻1818條經(jīng)驗 獲得超3個贊
憑空回答可以解決問題,但是它修改了整個方法,讓諸如Jackson + JAXB之類的提供程序自動將您返回的對象轉換為某種輸出格式(如JSON)。受Apache CXF 帖子(使用特定于CXF的類)的啟發(fā),我發(fā)現(xiàn)了一種設置應在任何JAX-RS實現(xiàn)中都可以使用的響應代碼的方法:注入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中),也可以將其作為成員變量注入?。∨c用實現(xiàn)細節(jié)污染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
}
添加回答
舉報