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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:20:40