将JSON moxy输出中的“type”改名

6

我在使用Moxy处理对象继承时遇到了困难。

具体来说,我需要重命名Moxy在子类型情况下添加的默认type元素,因为它会阻止我在我的对象中拥有自己的type字段。

这个问题涉及到Remove "type" from JSON output jersey moxy,但不幸的是,它没有回答我的问题。

我已经尝试在我的抽象类上包含@XmlDiscriminatorNode,但似乎对生成的JSON没有任何影响。

我也尝试完全删除Moxy的默认type元素,但没有成功。


请查看以下链接:https://dev59.com/6mvXa4cB1Zd3GeqPOviI#13838091 - Hein Blöd
看起来Blaise能够将它重命名为XML的classifier属性,所以我将尝试使用他在博客http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-moxy-extension.html中的示例重新开始。谢谢! - Stepan Vavra
1个回答

3
自 MOXy 2.6 开始,type 属性的处理方式发生了变化。从 MOXy 2.6 开始,默认情况下,type 属性将带有 xsi 前缀(或您定义的任何前缀)。这意味着,在 MOXy 版本 2.6 及更高版本中,不应该出现 type 属性冲突。
详细信息请参见 https://wiki.eclipse.org/EclipseLink/DesignDocs/459464 需要将命名空间前缀作为 JAXBContext 属性进行指定: unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); Map namespaces = new HashMap<>(); namespaces.put(javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi"); unmarshaller.setProperty(JAXBContextProperties.NAMESPACE_PREFIX_MAPPER, namespaces);

通过添加命名空间前缀映射器,MOXy 开始在各个地方添加命名空间,这是我们的 JavaScript 客户端无法接受的。我会看看能否消除除 XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI 命名空间之外的命名空间使用。 - Stepan Vavra
顺便问一下,是否支持使用@XmlCustomizerDescriptorCustomizer重命名type,其中可以调用ClassDescriptor.getInheritancePolicy().setClassIndicatorFieldName("@moxy-type")?当我尝试这样做时,MOXy失去了正确反序列化JSON的能力(听起来像是一个bug)。 - Stepan Vavra
删除不必要的命名空间应该解决这个问题。我知道在某些情况下这可能会非常烦人。 - Martin Vojtek
我以前没有使用过setClassIndicatorFieldName。但是,我在moxy测试中发现了这个:NamespaceResolver nsResolver = new NamespaceResolver(); nsResolver.put("xsi", javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); xmlDescriptor.setNamespaceResolver(nsResolver);xmlDescriptor.getInheritancePolicy().setClassIndicatorFieldName("@xsi:type");也许你可以不使用命名空间,而使用xmlDescriptor.getInheritancePolicy().setClassIndicatorFieldName("@type"); - Martin Vojtek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接