如何 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>>() {});
}
我有一个使用 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>>() {});
}