升级JBoss 7 EAP与JDK11后JAX-RS自定义@Provider未被调用
问题描述
我有一个RESTful JAX-RS应用,使用自定义@Provider处理异常,代码如下:
@Provider public class ValidationExceptionHandler implements ExceptionMapper<MethodConstraintViolationException> { @Override public Response toResponse(MethodConstraintViolationException exception) { // some code here return Response.status(Status.OK).entity(claimWithPaymentResponse).build(); } }
该Provider在JBoss 6 EAP与Java 7环境下可正常工作,但升级至JBoss 7 EAP与JDK 11并更新pom.xml依赖后,该Provider完全不被调用。以下是pom.xml中相关框架的依赖片段:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.0.0.GA</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>2.3.6.Final</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-hibernatevalidator-provider</artifactId> <version>2.3.6.Final</version> </dependency> <dependency> <!-- vpc9528, 2022-07-14, P1681-311 fixed "Provider com.sun.xml.internal.ws.spi.ProviderImpl not found" --> <groupId>com.sun.xml.ws</groupId> <artifactId>rt</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>javax.xml.ws</groupId> <artifactId>jaxws-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>javax.jws</groupId> <artifactId>javax.jws-api</artifactId> <version>1.1</version> </dependency>
解决方案
1. 修复依赖版本冲突
JBoss 7 EAP自带的Resteasy版本为3.x系列,你pom中指定的2.3.6.Final是JAX-RS 1.x实现,与引入的JAX-RS API 2.1.1完全不兼容,会导致类加载混乱:
- 移除
resteasy-jaxrs和resteasy-hibernatevalidator-provider的显式依赖,改用JBoss提供的内置模块,保持<scope>provided</scope>;若需自定义版本,升级到与JBoss 7 EAP匹配的Resteasy 3.0.x版本。 - 将
validation-api版本升级至1.1.0.Final或更高,匹配JBoss 7 EAP自带的Bean Validation版本,避免异常类加载不一致。
2. 确认实际抛出的异常类型
Bean Validation 1.1+版本中,异常类的触发逻辑或包路径可能变化,JBoss 7中抛出的可能是ConstraintViolationException而非方法级的MethodConstraintViolationException:
- 在接口方法中添加调试日志,捕获顶级异常并打印完整类名,确认实际抛出的异常类型。
- 修改
ExceptionMapper的泛型参数,匹配实际捕获的异常类。
3. 确保Provider被正确注册
JBoss 7 EAP对JAX-RS组件的扫描规则有调整,可能导致Provider未被自动发现:
- 若使用
Application子类,显式注册该Provider:
@ApplicationPath("/api") public class MyApplication extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(ValidationExceptionHandler.class); // 加入其他资源类 return classes; } }
- 查看JBoss部署日志,确认Provider是否被加载,若存在类加载错误,根据日志调整依赖或模块配置。
4. 适配JDK 11的模块变化
JDK 11移除了JAXB、JAX-WS等内置模块,需确保引入的第三方依赖与JBoss 7 EAP兼容:
- 核对
jaxb-api、jaxws-api等依赖版本与JBoss自带版本一致,避免类冲突;若需自定义版本,通过JBoss模块配置排除内置模块。
内容的提问来源于stack exchange,提问作者Alex Mi
相关产品推荐
相关产品推荐

