You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Quarkus 3中使用Mapper与ContextFilters时Jakarta优先级注解的工作机制

Quarkus 3中使用Mapper与ContextFilters时Jakarta优先级注解的工作机制

嘿,我来给你把Quarkus 3里这些Provider和过滤器的优先级逻辑说清楚~ 你现在的场景是REST客户端同时注册了ResponseExceptionMapper和Kafka的客户端过滤器,肯定是遇到了执行顺序的问题对吧?

首先得明确,Jakarta REST规范里的@Priority注解是用来管所有Provider的执行顺序的——不管是异常处理器、请求过滤器还是响应过滤器,都靠这个注解定先后:数值越小,优先级越高,执行时间越早

先说说默认的优先级规则

Jakarta本身定义了一套默认优先级常量(在jakarta.ws.rs.Priorities类里),Quarkus完全遵循这个规则:

  • 异常处理器ResponseExceptionMapper的默认优先级是Priorities.ENTITY_CODER(数值1000)
  • 客户端请求/响应过滤器的默认优先级是Priorities.HEADER_DECORATOR(数值3000)

这就意味着,默认情况下你的ResponseExceptionMapper会先执行——它会先把400+状态码的响应转换成异常,然后Kafka过滤器拿到的可能是转换后的响应,而不是原始的错误响应数据,这大概率不是你想要的。

怎么调整顺序满足你的需求?

很简单,给需要提前执行的Provider加@Priority注解,指定一个更小的数值就行。比如你想让Kafka的响应过滤器先捕获原始的错误响应,再让异常处理器处理,就给过滤器设置一个比1000小的数值:

比如你的Kafka响应过滤器代码:

@Priority(500) // 数值比1000小,优先级更高
public class KafkaClientResponseFilter implements ClientResponseFilter {
    // 这里先记录原始响应到Kafka的逻辑
}

而你的异常处理器保持默认或者显式指定默认优先级:

@Priority(1000) // 可以省略,默认就是这个数值
public class CustomResponseExceptionMapper implements ResponseExceptionMapper<WebApplicationException> {
    // 处理400+状态码的逻辑
}

额外注意点

  • 如果有多个同类型的Provider(比如多个响应过滤器),也遵循“数值越小越先执行”的规则
  • @RegisterProvider注册这些类的时候,不需要额外配置顺序,Quarkus会自动读取@Priority的数值来排序

这样调整之后,就能保证Kafka过滤器先拿到完整的原始响应信息发送到Topic,再由异常处理器处理错误状态啦~

备注:内容来源于stack exchange,提问作者Pedro Henrique

火山引擎 最新活动