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

Weblogic 12.2.1.3下MOXy兼容Jackson2注解实现枚举序列化反序列化

解决Weblogic环境下JAX-RS服务枚举序列化/反序列化不匹配问题

问题背景

现有两个部署在Weblogic上的JAX-RS服务:

  • 提供者服务通过openapi-generator-maven-plugin的jaxrs-spec选项结合API描述文件生成,枚举类带有Jackson2的@JsonValue和@JsonCreator注解,预期MyEnum.FIRST_VALUE序列化为"first_value"
  • 消费者服务通过Jersey Client调用提供者API
    当前问题:Weblogic默认使用的MOXy会忽略Jackson注解,导致服务端接收、客户端发送的枚举值都是"FIRST_VALUE",不符合预期。

解决方案

一、服务端(提供者):强制使用Jackson替代MOXy

禁用MOXy并配置Jackson作为JAX-RS的JSON提供者,有两种可行方式:

  1. 通过JAX-RS应用类注册Jackson提供者
    在自定义或生成的Application子类中,显式注册JacksonJaxbJsonProvider:
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

public class MyJaxrsApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<>();
        // 注册Jackson JSON提供者
        classes.add(JacksonJaxbJsonProvider.class);
        // 添加你的资源类
        classes.add(MyResource.class);
        return classes;
    }
}
  1. 通过Weblogic部署描述文件配置
    在weblogic.xml中添加配置,让Weblogic优先加载应用内的Jackson包,替代默认MOXy:
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app">
    <wls:context-root>your-app-root</wls:context-root>
    <wls:container-descriptor>
        <wls:prefer-application-packages>
            <wls:package-name>com.fasterxml.jackson.*</wls:package-name>
            <wls:package-name>javax.ws.rs.*</wls:package-name>
        </wls:prefer-application-packages>
    </wls:container-descriptor>
</wls:weblogic-web-app>

同时确保项目依赖中包含Jackson的JAX-RS模块:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>你的Jackson版本</version>
</dependency>

二、客户端(消费者):配置Jersey Client使用Jackson

Jersey Client默认可能依赖MOXy,需手动注册Jackson提供者,确保序列化遵循@JsonValue注解:

import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import org.glassfish.jersey.client.ClientConfig;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;

// 创建Jersey Client时注册Jackson提供者
ClientConfig config = new ClientConfig();
config.register(JacksonJaxbJsonProvider.class);
Client client = ClientBuilder.newClient(config);

// 使用该client调用API,枚举会按@JsonValue序列化为"first_value"
MyResponse response = client.target("http://provider-service-url/api/endpoint")
        .request()
        .post(javax.ws.rs.client.Entity.entity(myRequestWithEnum, "application/json"), MyResponse.class);

如果需要自定义Jackson配置(比如忽略未知属性),可以绑定自定义ObjectMapper:

ObjectMapper customMapper = new ObjectMapper();
customMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(customMapper);
config.register(provider);

验证

完成上述配置后:

  • 客户端发送请求时,枚举值会正确序列化为"first_value"
  • 服务端接收请求时,能将"first_value"反序列化为对应的枚举实例

内容的提问来源于stack exchange,提问作者tim-danger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:45:37