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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:25:23