gpt4 book ai didi

java - 使用 Java 处理 REST Web 服务中的错误

转载 作者:行者123 更新时间:2023-12-01 10:53:13 25 4
gpt4 key购买 nike

我有一个 REST 服务,其方法用 @Produces("application/pdf") 注释.

如果服务器端发生异常,我们的逻辑会抛出自定义异常,该异常扩展 RuntimeException我有:

throw new CustomerException(new CustomProblem("something wrong"));

将东西返回给客户的最佳方式是什么,在这种情况下客户会看到:

Status: 500
Body: No message body writer has been found for response class CustomProblem.

最佳答案

之前我回答过类似的问题here

基本上,您可以采用以下方法之一来处理异常(摘自 Jersey documentation 但也适用于 RESTEasy 或其他 JAX-RS 2.0 实现):

扩展WebApplicationException

JAX-RS 允许定义 Java 异常到 HTTP 错误响应的直接映射。通过扩展 WebApplicationException ,您可以创建特定于应用程序的异常,以使用状态代码和可选消息作为响应正文来构建 HTTP 响应。

以下异常使用 404 构建 HTTP 响应状态码:

public class CustomerNotFoundException extends WebApplicationException {

/**
* Create a HTTP 404 (Not Found) exception.
*/
public CustomerNotFoundException() {
super(Responses.notFound().build());
}

/**
* Create a HTTP 404 (Not Found) exception.
* @param message the String that is the entity of the 404 response.
*/
public CustomerNotFoundException(String message) {
super(Response.status(Responses.NOT_FOUND).
entity(message).type("text/plain").build());
}
}

WebApplicationException RuntimeException 并且不需要包裹在 try 中-catch block 或在 throws 中声明子句:

@Path("customers/{customerId}")
public Customer findCustomer(@PathParam("customerId") Long customerId) {

Customer customer = customerService.find(customerId);
if (customer == null) {
throw new CustomerNotFoundException("Customer not found with ID " + customerId);
}
return customer;
}

创建ExceptionMapper s

在其他情况下,抛出 WebApplicationException 的实例可能不合适。 ,或扩展 WebApplicationException 的类,相反,最好将现有异常映射到响应。

对于这种情况,可以使用自定义异常映射提供程序。提供商必须实现 ExceptionMapper<E extends Throwable> 界面。例如,以下映射 JAP EntityNotFoundException 到 HTTP 404 回复:

@Provider
public class EntityNotFoundExceptionMapper
implements ExceptionMapper<EntityNotFoundException> {

@Override
public Response toResponse(EntityNotFoundException ex) {
return Response.status(404).entity(ex.getMessage()).type("text/plain").build();
}
}

EntityNotFoundException 被抛出, toResponse(E) EntityNotFoundExceptionMapper的方法实例将被调用。

@Provider 注释声明 JAX-RS 运行时对该类感兴趣。这样的类可以添加到 Application 的类集合中。配置的实例。

关于java - 使用 Java 处理 REST Web 服务中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com