You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带@Provider的异常处理类移至公共库并在Quarkus应用中按需启用?

最佳实现方案

先修正并迁移异常处理类到公共库

首先得把你原代码里的几个小问题改了(比如ExtensionMapper应该是ExceptionMapper,方法参数缺失命名,还有语法疏漏),然后把这个类移到FruitServicesLib中:

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import io.quarkus.arc.profile.IfBuildProfile;

// 用构建配置文件做条件激活,也可以用配置属性替代
@Provider
@IfBuildProfile(anyOf = {"apple", "banana"})
public class IllegalArgumentExceptionMapper implements ExceptionMapper<IllegalArgumentException> {
    @Override
    public Response toResponse(IllegalArgumentException e) {
        return Response.status(Status.BAD_REQUEST).build();
    }
}

给目标应用配置激活规则

方案1:基于构建配置文件(Build Profile)激活

  • 在MyApplesRestApp的application.properties中添加:
    quarkus.profile=apple
    
  • 在MyBananasRestApp的application.properties中添加:
    quarkus.profile=banana
    
  • MyTomatoesRestApp使用默认配置或者其他非apple/banana的profile即可,该异常映射器不会被加载。

方案2:基于自定义配置属性激活

如果不想依赖profile,也可以用配置开关控制,修改公共库中的映射器类:

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import io.quarkus.arc.config.IfBuildProperty;

@Provider
@IfBuildProperty(name = "fruit.exception.mapper.enabled", stringValue = "true")
public class IllegalArgumentExceptionMapper implements ExceptionMapper<IllegalArgumentException> {
    @Override
    public Response toResponse(IllegalArgumentException e) {
        return Response.status(Status.BAD_REQUEST).build();
    }
}

然后在对应应用中配置:

  • MyApplesRestApp和MyBananasRestApp的application.properties添加:
    fruit.exception.mapper.enabled=true
    
  • MyTomatoesRestApp不配置该属性,或者设置为false,映射器就不会生效。

备选方案:在不需要的应用中直接排除Provider

如果无法修改公共库代码,也可以在MyTomatoesRestApp中通过配置排除该映射器,在它的application.properties里添加:

quarkus.jaxrs.exclude-providers=com.yourpackage.IllegalArgumentExceptionMapper

不过这种被动排除的方式不如前面主动控制加载的方案灵活,优先推荐前两种。

关键细节说明

  • Quarkus中@Provider会被当作CDI Bean处理,因此可以用Arc提供的@IfBuildProfile、@IfBuildProperty等条件注解精准控制实例化时机。
  • 若使用条件注解,需确保FruitServicesLib引入Quarkus Arc依赖(Maven示例):
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-arc</artifactId>
    <scope>provided</scope>
</dependency>

内容的提问来源于stack exchange,提问作者Ilya Kharlamov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:22:55