如何 return 响应消息,jax rs

How to return Response with message, jax rs

我有一个使用 jax-rs 的 web 服务,我的服务 return 一个对象列表,但是你不知道如何将自定义状态值添加到响应中,例如 我要构建的结果如下:

如果没问题:

{
   "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
    }
    } 

如果您想完全控制输出 JSON 结构,请使用 JsonObjectBuilder(如 here 所述,然后将最终的 json 转换为字符串并写入(例如成功 json):

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

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

但是请注意,您正在尝试发送冗余的(非标准的)信息,这些信息已经被编码到 HTTP 错误代码中。当您使用 Response.Ok 时,响应将包含代码“200 OK”,您可以研究 Response class 方法来 returning 您想要的任何 HTTP 代码。 在你的情况下它将是:

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

return正在处理 404 HTTP 代码(查看 Response.Status 代码列表)。

我遇到了同样的问题,下面是我的解决方法。 如果您的服务方法成功,return 响应状态为 200 并包含您想要的实体。如果您的服务方法抛出异常,return 具有不同状态和异常消息的响应将绑定到您的 RestError class.

@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>>() {});
}