Apache TomEE Webprofile 8:无法将JSON Rest Provider从Johnzon切换为Jackson
解决TomEE Webprofile 8.0.12替换Johnzon为Jackson的问题
问题症状
在TomEE 8.0.12中部署的REST服务,使用Jackson的@JsonIgnore和@JacksonFeatures注解未生效:响应仍包含被标记忽略的属性,且JSON未按预期格式化,说明TomEE仍在使用默认的Johnzon库处理JSON。
解决步骤
1. 正确引入Jackson依赖
TomEE默认不包含Jackson的JAX-RS相关组件,需在项目中手动添加依赖:
<dependencies> <!-- Jackson核心序列化/反序列化依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 选择兼容Java EE 8的稳定版本 --> </dependency> <!-- Jackson JAX-RS Provider核心包 --> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.15.2</version> </dependency> <!-- 可选:若需支持JAXB注解与Jackson混用 --> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.15.2</version> </dependency> </dependencies>
2. 修正openejb-jar.xml配置
原配置中的class-name="jaxrs-application"是占位符,需替换为项目实际的JAX-RS Application类全限定名。如果没有自定义Application类,先创建一个:
import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/api") // 替换为你的REST服务根路径 public class JaxrsApplication extends Application { }
然后修改openejb-jar.xml,指定该Application类的配置:
<?xml version="1.0" encoding="UTF-8"?> <openejb-jar xmlns="http://www.openejb.org/openejb-jar/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openejb.org/openejb-jar/1.1"> <pojo-deployment class-name="com.yourpackage.JaxrsApplication"> <!-- 替换为你的Application类全限定名 --> <properties> cxf.jaxrs.providers = com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider </properties> </pojo-deployment> </openejb-jar>
3. 排除TomEE自带的Johnzon依赖
避免Johnzon与Jackson冲突,在打包时排除TomEE内置的Johnzon相关JAR包,修改pom.xml中的Maven War插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <packagingExcludes>WEB-INF/lib/johnzon-*.jar</packagingExcludes> </configuration> </plugin> </plugins> </build>
4. 验证Jackson Provider加载状态
可以创建自定义Jackson Provider类,通过日志确认是否被TomEE正确加载:
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import com.fasterxml.jackson.databind.SerializationFeature; import javax.ws.rs.Produces; import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Provider; @Provider @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public class CustomJacksonProvider extends JacksonJaxbJsonProvider { public CustomJacksonProvider() { System.out.println("CustomJacksonProvider initialized - Jackson is active"); // 全局配置序列化特性,比如开启格式化输出 configure(SerializationFeature.INDENT_OUTPUT, true); } }
之后在openejb-jar.xml中指定该自定义Provider,或依靠JAX-RS的组件扫描自动发现(需确保Application类所在包被扫描)。
5. 确认注解使用正确性
确保使用Jackson原生注解:
@JsonIgnore对应包路径com.fasterxml.jackson.annotation.JsonIgnore- 避免混用JAXB的
@XmlTransient(Johnzon会识别该注解,但Jackson优先使用自身注解)
验证
重新部署应用后调用REST接口:
- 响应中不应包含
prop1属性 - JSON应按格式化要求输出(带缩进)
内容的提问来源于stack exchange,提问作者Massimo Intelisano
相关产品推荐
相关产品推荐

