JAX-RS —如何一起返回JSON和HTTP状态代码?

我正在编写REST Web应用程序(NetBeans 6.9,JAX-RS,TopLink Essentials),并尝试返回JSON 和 HTTP状态代码。我已经准备好工作的代码,当从客户端调用HTTP GET方法时,该代码返回JSON。实质上:


@Path("get/id")

@GET

@Produces("application/json")

public M_機械 getMachineToUpdate(@PathParam("id") String id) {


    // some code to return JSON ...


    return myJson;

}

但是,我也想用JSON数据一起返回的HTTP状态代码(500,200,204,等)。


我尝试使用HttpServletResponse:


response.sendError("error message", 500);

但是,这使浏览器认为它是“真实的” 500,因此输出网页是常规的HTTP 500错误页面。


我想返回一个HTTP状态代码,以便我的客户端JavaScript可以处理一些依赖于它的逻辑(例如,在HTML页面上显示错误代码和消息)。这是可能的还是不应该将HTTP状态代码用于这种情况?


蝴蝶不菲
浏览 776回答 3
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 threadsprivate 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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java