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提供者,有两种可行方式:
- 通过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; } }
- 通过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
相关产品推荐
相关产品推荐

