如何将带@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=trueMyTomatoesRestApp不配置该属性,或者设置为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
相关产品推荐
相关产品推荐

