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




