gpt4 book ai didi

java - JAXB/MOXy : How to un-/marshall a field containing a scalar or list of scalars

转载 作者:行者123 更新时间:2023-12-01 04:51:35 25 4
gpt4 key购买 nike

我有一组属性,单个属性的每个值要么是标量(字符串、整数……),要么是标量集合(集合、集合……)。以下是一个 XML 文档作为示例:

<properties xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:java="http://java.oracle.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<property name="test#1" xsi:type="xs:int">1</property>
<property name="test#2" xsi:type="java:int[]">
<value xsi:type="xs:int">1</value>
<value xsi:type="xs:int">2</value>
<value xsi:type="xs:int">3</value>
<value xsi:type="xs:int">4</value>
</property>
</properties>

这是我想使用的类,但我不知道如何正确标记值字段以使用和生成此结构。它必须以标量或标量列表的形式包含属性元素的解析内容。数据类型作为属性值出现。

@XmlRootElement(name = "property")
public class Property {

@XmlAttribute(name = "name")
protected String name;
@???
protected Object value;
}

使用两个字段protected Object scalarprotected List<Object> list ,其中一个标记为 @XmlValue ,另一个为 @XmlElement(name = "value")不工作。

有人有想法吗?

更新 1

我标记了Property如下:

@XmlRootElement(name = "property")
public class Property {

@XmlAttribute(name = "name")
protected String name;
@XmlJavaTypeAdapter(Test2Adapter.class)
@XmlPath(".")
protected Object value;
}

我已经部分实现了以下适配器类

public class Test2Adapter extends XmlAdapter<AdaptedValue, Object> {

@Override
public Object unmarshal(AdaptedValue v) throws Exception {
if (v instanceof Scalar) {
return ((Scalar) v).value;
}
if (v instanceof Complex) {
return ((Complex) v).value;
}
return null;
}

@Override
public AdaptedValue marshal(Object v) throws Exception {
if (v instanceof String) {
Scalar s = new Scalar();
s.value = v;

return s;
}
if (v instanceof Collection) {
Complex c = new Complex();
c.value = (Collection<? extends Object>) v;

return c;
}
return null;
}

调整值:

@XmlSeeAlso({ Scalar.class, Complex.class })
public abstract class AdaptedValue {
}

标量:

public class Scalar extends AdaptedValue {

@XmlValue
public Object value;

}

复杂:

public class Complex extends AdaptedValue {

@XmlAttribute(name = "xsi:type")
public String type;

@XmlElement(name = "value")
public Collection<? extends Object> value
}

一切都已正确编码,但解码不起作用。我收到以下异常:

javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-43] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345):
org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class for indicator field value [xs:string] of type[class java.lang.String].
Descriptor:
XMLDescriptor(com.materna.osgi.service.cm.rest.resource.representation.Test2Adapter$AdaptedValue --> [])]
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:190)

最佳答案

如果我没记错的话,您需要一个名为 XmlJavaTypeAdapter 的东西。我很久以前就用过这个,现在手边没有我的代码,但是请看一下链接,如果您仍然遇到困难,请给我留言。

http://weblogs.java.net/blog/kohsuke/archive/2005/04/xmladapter_in_j.html

在上面帖子的评论部分,“pomcompot”提到使用列表/集合的包装器。我记得使用了包装类并且它有效。

http://www.caucho.com/resin-3.1/doc/jaxb-annotations.xtp#XmlJavaTypeAdapter

关于java - JAXB/MOXy : How to un-/marshall a field containing a scalar or list of scalars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872519/

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