Jersey 1.x迁移至2.X:JSON反序列化代码适配方案咨询
Jersey 1.X 迁移至 2.X:JSON反序列化代码修改方案
核心变化说明
Jersey 2.X 已废弃 1.X 中自定义的 JSONJAXBContext、JSONUnmarshaller 等JSON-JAXB集成类,转而依赖标准的JSON处理库(推荐Jackson,也是Jersey 2.X生态中最常用的JSON Provider)。
步骤1:更新依赖
如果使用Maven,替换原Jersey 1.X的JSON依赖为Jackson集成包:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>你的Jersey 2.X版本号(如2.41)</version> </dependency>
步骤2:修改反序列化代码
替换原代码为基于Jackson ObjectMapper 的实现,若需兼容原JAXB注解(如@XmlRootElement、@XmlElement),可注册Jackson的JAXB注解模块以保持原有序列化/反序列化行为:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; public static Filter buildFilter(String s) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); // 若原代码依赖JAXB注解,添加此模块确保行为一致 objectMapper.registerModule(new JaxbAnnotationModule()); FilterModel model = objectMapper.readValue(s, FilterModel.class); return model.build(); }
替代方案:使用MOXy(Jersey 2.X默认JSON Provider)
若偏好使用Jersey默认的MOXy实现,可直接使用JAXB标准的Unmarshaller配合MOXy配置,模拟原代码的natural JSON格式:
import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import org.eclipse.persistence.jaxb.JAXBContextProperties; import java.util.HashMap; import java.util.Map; import java.io.StringReader; public static Filter buildFilter(String s) throws Exception { // 配置MOXy使用无根节点的自然JSON格式(对应原JSONConfiguration.natural()) Map<String, Object> properties = new HashMap<>(); properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json"); properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false); JAXBContext context = JAXBContext.newInstance(new Class[]{FilterModel.class}, properties); Unmarshaller unmarshaller = context.createUnmarshaller(); FilterModel model = (FilterModel) unmarshaller.unmarshal(new StringReader(s)); return model.build(); }
此方案需确保MOXy依赖存在(Jersey 2.X默认包含,若缺失可手动添加org.glassfish.jersey.media:jersey-media-moxy)。
内容的提问来源于stack exchange,提问作者oldMonk
相关产品推荐
相关产品推荐

