如何使用消息返回响应,jax rs

时间:2017-09-13 14:12:46

标签: java json return jax-rs response

我有一个使用jax-rs的Web服务休息,我的服务返回一个对象列表但是我不知道如何向响应添加自定义状态值,例如 我想要构建的结果如下:

如果可以:

{
   "status": "success",
   "message": "list ok!!",
   "clients": [{
        "name": "john",
        "age": 23
    },
    {
        "name": "john",
        "age": 23
    }]
}

如果是错误:

{
   "status": "error",
   "message": "not found records",
   "clients": []
}

我的休息服务:

 @POST
 @Path("/getById")
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
 public List<Client> getById(Client id) {

  try {

       return Response.Ok(new ClientLogic().getById(id)).build();
       //how to add status = success, and message = list! ?

    } catch (Exception ex) {
       return  ??   
       // ex.getMessage() = "not found records"
       //i want return json with satus = error and message from exception
    }
    } 

2 个答案:

答案 0 :(得分:4)

如果要完全控制输出JSON结构,请使用JsonObjectBuilder(如解释here),然后将最终的json转换为String并写入(例如成功json):

return Response.Ok(jsonString,MediaType.APPLICATION_JSON).build();

并将您的返回值更改为Response对象。

但请注意,您正在尝试发送冗余(而非标准)信息,这些信息已编码到HTTP错误代码中。当您使用Response.Ok时,响应将具有代码“200 OK”,您可以研究Response类方法以返回所需的任何HTTP代码。 在你的情况下,它将是:

return Response.status(Response.Status.NOT_FOUND).entity(ex.getMessage()).build();

返回404 HTTP代码(查看Response.Status代码列表)。

答案 1 :(得分:2)

我遇到了同样的问题,这就是我如何解决它。 如果您的服务方法成功,请返回状态为200且具有所需实体的响应。如果您的服务方法抛出异常,则返回具有不同状态的Response,并将异常消息绑定到您的RestError类。

@POST
@Path("/getById")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getById(Client id) {
  try {    
    return Response.Ok(new ClientLogic().getById(id)).build();
  } catch (Exception ex) {
    return Response.status(201) // 200 means OK, I want something different
                   .entity(new RestError(status, msg))
                   .build();   
  }
}

在客户端,我使用这些实用程序方法从Response读取实体。如果出现错误,我会抛出一个包含该错误的状态和消息的异常。

public class ResponseUtils {

  public static <T> T convertToEntity(Response response, 
                                      Class<T> target)
                          throws RestResponseException {
    if (response.getStatus() == 200) {
      return response.readEntity(target);
    } else {
      RestError err = response.readEntity(RestError.class);
      // my exception class
      throw new RestResponseException(err);
    }
  }

  // this method is for reading Set<> and List<> from Response
  public static <T> T convertToGenericType(Response response,
                                           GenericType<T> target)
                          throws RestResponseException {
    if (response.getStatus() == 200) {
      return response.readEntity(target);
    } else {
      RestDTOError err = response.readEntity(RestError.class);
      // my exception class
      throw new RestResponseException(err);
    }
  }

}

我的客户端方法将调用(通过代理对象)服务方法

public List<Client> getById(Client id) 
                        throws RestResponseException {
  return ResponseUtils.convertToGenericType(getProxy().getById(id),
                                            new GenericType<List<Client>>() {});
}