gpt4 book ai didi

java - Jersey 两次序列化继承的属性(property)

转载 作者:搜寻专家 更新时间:2023-11-01 02:54:03 24 4
gpt4 key购买 nike

我有一个没有任何注释的 java bean。我有一个从这个带有 JAXB 注释的 bean 继承的类。

Jersey (JAX-RS) 将第二个类序列化为 JSON。并且继承的属性在 JSON 中出现两次:名称来自 XmlElement 注释和 java-bean 属性的“驼峰式”名称。这是说明这一点的代码:

class MyBean {

private Integer beanField;

public Integer getBeanField() { return beanField; }

public void setBeanField(Integer value) { this.beanField = value; }

}

@XmlRootElement
class AnnotatedBean extends MyBean {

@Override
@XmlElement(name="field")
public Integer getBeanField() { return super.getBeanField(); }
}

序列化后我得到下一个 JSON:

{ 
"field" : 5,
"beanField" : 5
}

(虽然我希望它只包含一个名为 field 的字段)。

我调查了 JAXB 编码器实现,发现它编码了给定类的所有父类(super class)的属性(这意味着不可能摆脱我示例中奇怪的 beanField 属性)。

但我还是希望我能错过一些东西。有没有办法只序列化带注释的属性?

最佳答案

要仅获取带注释的属性,请使用 XmlAccessType.NONE:

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
class AnnotatedBean extends MyBean {
...
}

使用外部化元数据映射第 3 方类

您可以使用 external metadata extension在 EclipseLink JAXB (MOXy) 中,我是技术主管。它允许您为 3rd 方类提供元数据。对于此示例,元数据将如下所示:

<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="third.party.package">
<java-types>
<java-type name="MyBean" xml-transient="true"/>
</java-types>
</xml-bindings>

要使用 MOXy,您需要在模型类中添加一个名为 jaxb.properties 的文件,其中包含以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

以下文章包含有关配置 MOXy 以与 Jersery 一起使用的说明:

上下文解析器 - 利用元数据

您需要使用 ContextResolver 来获取 JAXBContext 以利用外部绑定(bind)文件。在实例化 JAXBContext 时通过属性指定元数据:

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import javax.xml.bind.JAXBContext;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

@Provider
@Produces({"application/xml", "application/json"})
public class AnnotatedBeanContextResolver implements ContextResolver<JAXBContext> {

private JAXBContext jaxbContext;

public PurchaseOrderContextResolver() {
try {
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, new File("src/blog/bindingfile/binding.xml"));
jaxbContext = JAXBContext.newInstance(new Class[] {AnnotatedBean.class}, properties);
} catch(Exception e) {
throw new RuntimeException(e);
}
}

public JAXBContext getContext(Class<?> clazz) {
if(AnnotatedBean.class == clazz) {
return jaxbContext;
}
return null;
}

}

关于java - Jersey 两次序列化继承的属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5259216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com