WebLogic迁移至JBoss遇JaxB问题:未知枚举常量AccessType.FIELD
unknown enum constant AccessType.FIELD的问题 我之前在把Java应用从WebLogic迁移到JBoss、同步升级JAXB和Spring的时候,碰到过一模一样的警告,给你几个经过验证的解决方案:
问题根源
简单来说,JAXB 2.0里的AccessType枚举在JAXB 2.2里被重命名为XmlAccessType了,而Spring 4.3.x在处理JAXB注解时,要么是类路径里混进了旧版本的JAXB依赖,要么是实体类里的注解还在引用过时的枚举名,导致找不到正确的枚举常量。
解决方案
1. 统一JAXB依赖,排除冲突的旧Jar
先检查你的项目依赖配置(Maven/Gradle都行),确保所有JAXB相关依赖都是2.2.x版本,同时排除掉WebLogic或JBoss自带的旧版本JAXB模块:
- 以Maven的
pom.xml为例,锁定JAXB版本:
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.2.11</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version> <scope>runtime</scope> </dependency>
- 排查其他依赖间接引入的低版本JAXB,用
<exclusions>标签把它们排除掉。
2. 修正实体类中的注解引用
检查所有使用@XmlAccessorType的实体类,把旧的枚举引用替换成JAXB 2.2的正确枚举:
- 把之前的代码:
import javax.xml.bind.annotation.AccessType; import javax.xml.bind.annotation.XmlAccessorType; @XmlAccessorType(AccessType.FIELD)
- 改成:
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @XmlAccessorType(XmlAccessType.FIELD)
如果之前用了全限定名,也要同步改成javax.xml.bind.annotation.XmlAccessType.FIELD,避免类加载时出现混淆。
3. 调整JBoss部署配置,排除自带JAXB模块
JBoss本身自带了JAXB系统模块,很可能和你应用打包的JAXB 2.2 Jar冲突。可以在项目根目录创建jboss-deployment-structure.xml文件,强制JBoss使用应用自带的JAXB版本:
<jboss-deployment-structure> <deployment> <exclusions> <module name="javax.xml.bind.api"/> <module name="com.sun.xml.bind"/> </exclusions> </deployment> </jboss-deployment-structure>
4. 显式配置Spring的Jaxb2Marshaller
如果你的Spring配置里用到了Jaxb2Marshaller,可以显式指定要绑定的类或上下文路径,避免Spring自动扫描时出现类加载问题:
@Bean public Jaxb2Marshaller jaxb2Marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); // 显式指定要绑定的实体类 marshaller.setClassesToBeBound(UserEntity.class, OrderEntity.class); // 或者指定JAXB上下文路径 // marshaller.setContextPath("com.yourcompany.jaxb.models"); return marshaller; }
验证
做完以上调整后,重新编译部署应用,应该就不会再出现unknown enum constant AccessType.FIELD的警告了。如果还有问题,可以检查类路径下的JAR包,确保没有jaxb-api-2.0.jar这类旧版本文件存在。
内容的提问来源于stack exchange,提问作者Suman Saha

