如何使用微配置文件记录内部错误

如何解决如何使用微配置文件记录内部错误

假设以下代码是用 Quarkus 编写的。但也可以和 micronaut 一起使用。

@POST
@Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @APIResponses(
            value = {
                    @APIResponse(
                            responseCode = "201",description = "Customer Created"),@APIResponse(
                            responseCode = "400",description = "Customer already exists for customerId")
            }
    )
    public Response post(@Valid Customer customer) {
        final Customer saved = customerService.save(customer);
        return Response.status(Response.Status.CREATED).entity(saved).build();
    }

客户定义包括一个字段pictureUrl。 CustomerService 负责验证 URL 是有效的 URL 并且图像确实存在。

这意味着服务将处理以下异常:MalformedURLException 和 IOException。 CustomerService 捕获这些错误并抛出特定于应用程序的异常以报告图像不存在或路径不正确:ApplicationException。

您如何使用微配置文件记录此错误案例?

我的研究表明我必须实现以下形式的异常映射器:

public class ApplicationExceptionMapper implements ExceptionMapper<NotFoundException> {

    @Override
    @APIResponse(responseCode = "404",description = "Image not Found",content = @Content(
            schema = @Schema(implementation = Customer.class)
        )
    )
    public Response toResponse(NotFoundException t) {
        return Response.status(404,t.getMessage()).build();
    }

}

一旦我有了这样的映射器,框架就会知道如何将我的异常转换为响应。我的分析正确吗?最佳做法是什么?

解决方法

你或多或少指向了正确的方向,你的问题可以分为两个,让我分别回答:

  1. 如何使用 microprofile openapi 记录错误: 使用 api 响应和操作描述是您正在做的正确方法,您可以包含错误的扩展描述和特定的 Http 错误如果需要,与每个相关联的代码。此注释应出现在 Rest Resource 中,而不是 ExceptionMapper 中。
  2. 使用微配置文件或仅使用 Jax-RS 处理异常的方式处理自定义错误: 使用 Jax-RS API 实现的端点知道如何自动处理 WebApplicationExceptions,通过启动一个自定义异常具有这个我们的父级,Jax-RS 实现将自动知道如何将您的异常映射到响应。
  3. 处理意外异常或自定义某些异常的响应:通过实现接口 ExceptionMapper,您可以根据需要进一步自定义特定异常的响应生成,但这通常不是必需的。

处理您所解释的场景的一个常见的好策略是使用一系列自定义异常来扩展 WebApplicationException,您可以在其中指定响应代码和消息,或者只使用 jax-rs 提供的那些。如果您需要使用 i18n 支持进行进一步自定义,或者需要为响应实体提供与错误相关的详细信息很重要,那么请实现 ExceptionMapper。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?