当前位置: 首页 > 知识库问答 >
问题:

REST服务:返回异常的正确方法

况鸿雪
2023-03-14

我使用泽西API进行我的REST服务。我的问题是:是否有更优雅的方式以JSON形式返回异常?最好是自己创建一个json对象并将其直接附加到响应中?

这是服务中一种方法的简化示例。如您所见,我使用HashMap只是因为该方法可能引发异常,在这种情况下,我需要返回有关它的信息。

@Path("/admin")
public class AdminService {

    @Context
    HttpServletRequest request;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Map<Integer, String> createCompany(Company company){

        Map<Integer, String> map = new HashMap<>();
        try{
            AdminFacade adminFacade = (AdminFacade)Utility.getFacade(request);
            adminFacade.createCompany(company);
            map.put(1,"success");
        } catch (ExceptionREST e) {
            map.put(e.getErrorNumber(), e.getMessage());
        } finally {
            return map;
        }
    }
}

共有3个答案

黄仲渊
2023-03-14

您可以将错误包装到一个类中,比如我有一个ErrorData类,它包含status、message和stacktrace。每次发生异常时,我都会抛出一个带有errordata对象的GeneralAppException。

public class GeneralAppException  extends WebApplicationException {
 public GeneralAppException(ErrorData er) {

            super(Response.status(er.getStatusCode()).
            entity(er).type(MediaType.APPLICATION_JSON).build());
          }
}

我有另一个类,它有所有已知的错误,例如。

public static final ErrorData NODATAFOUND = new ErrorData(Response.Status.NOT_FOUND.getStatusCode(),"No data was found for given query");

public static final ErrorData CODEERROR = new ErrorData(502,"CodeError");

你的渔获物看起来像

catch (ExceptionREST e) {
        throw new GeneralAppException(ErrorData.NODATAFOUND);
    } 

使用的参考:https://jersey.java.net/documentation/latest/representations.html#d0e6665

狄令
2023-03-14

我相信人们使用http响应状态代码来处理错误是非常流行的。E、 g.找不到404状态5xx是服务器内部错误E.t.c。您可以使用响应对象轻松设置错误代码。返回响应对象,而不是返回映射。

@Path("/admin")public class AdminService {

@Context
HttpServletRequest request;

@POST
@Produces(MediaType.APPLICATION_JSON)
public Response createCompany(Company company){

    Map<Integer, String> map = new HashMap<>();
    try{
        AdminFacade adminFacade = (AdminFacade)Utility.getFacade(request);
        Company commpany=adminFacade.createCompany(company);//this entity annotated by XmlRootElement
        Response response=Response.ok().entity(company).build();
    } catch (ExceptionREST e) {
        response=Response.status(404).build();
    } return response;
}}

为了使Restful api更加健壮,有些会返回一个OK响应以防止来自服务器的“智能重定向”并输出一些奇怪的html。您可以在这里参考超文本传输协议状态代码列表及其含义。对于JavaEE响应类,您可以参考官方的javadoc

吕博耘
2023-03-14

您可以创建一个像下面这样的类来表示错误,

@JsonPropertyOrder({ "code", "field", "message" })
public class ErrorInfo {

    private String code;

    private String field;

    private String message;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

您可以创建一个类来扩展这样的异常,

public class InvalidInputException extends RuntimeException {

    private static final long serialVersionUID = -5027121014723838738L;

    private List<ErrorInfo> errors;

    public List<ErrorInfo> getErrors() {
        return this.errors;
    }

    public InvalidInputException(List<ErrorInfo> errors) {
        super();
        this.errors = errors;
    }

    public InvalidInputException(String message, List<ErrorInfo> errors) {
        super(message);
        this.errors = errors;
    }

}

还有一个异常映射器,您可以在其中将列表转换为json并返回给http状态代码为400(错误请求)的用户。

@Provider
public class InvalidInputExceptionMapper implements ExceptionMapper<InvalidInputException> {

    @Override
    @Produces(MediaType.APPLICATION_JSON)
    public Response toResponse(InvalidInputException e) {

        ResponseBuilder rb = Response.status(Status.BAD_REQUEST);

        rb.entity(e.getErrors());
        return rb.build();   
    }
}

Http响应将是,

HTTP/1.1 400 BAD REQUEST
{
"errors": [{
    "error": {
        "code": "100",
        "field": null,
        "message": "Name is required"
    },
    "error": {
        "code": "100",
        "field": null,
        "message": "Age is required"
    }
}]

}

 类似资料:
  • 从rest服务抛出的异常以某种方式返回为JSON是否可能?我有一个JAX-RS Rest服务来实现这一点。当我现在抛出它时,它被映射到一个HTML响应,这不是我想要的。据我所知,ExceptionMapper也会将其映射到HTML?是否有其他可供选择的或库允许以JSON格式返回异常?

  • 我有以下Rest服务API来更新“朋友”数据集: 当我尝试将更新的对象“朋友”通过使用Spring restTemboard这样: 我得到一个HTTP 400 BadRequest错误。 我不知道为什么会这样。你有什么建议吗?

  • 基本上,我想做一个POST请求与以下主体: 为什么会这样?

  • 如何正确处理由期货构建的Monos? 我试着让我的头脑围绕着Spring Reactive(和Spring 5),观看所有的视频,阅读所有我能找到的博客,但他们似乎都没有做一些事情,而不仅仅是查询数据库或其他琐碎的事情。 我正在使用新的AWS 2.0开发工具包,它使用的用于大多数事情。使用服务创建新实例,我的方法如下所示 我在这里的理解是,我几乎立即返回类型的,而将随时执行它的操作。 我从我的路由

  • 问题内容: 我正在用Java开发与MySQL db通信的应用程序,而在测试它时,我注意到在表中插入新行的代码引发了MySQLSyntaxError异常,因此我尝试使用MySQL Workbench执行相同的INSERT,而且有效。有问题的代码是这样的: 编辑:对不起,堆栈跟踪是: 问题答案: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExcep

  • 我正在使用quarkus版本,需要知道如何处理未知endpoint。当我试图命中尚未实现的endpoint时,它只会发送,而不是我希望实现的异常。我无法找到相同的实现。有人能帮我做这个吗?