JAXB 泛型 @XmlValue
目标是使用 JAXB 生成以下 XML
<foo>
<bar>string data</bar>
<bar>binary data</bar>
</foo>
是否有解决方法允许通用 @XmlValue
字段(我需要存储byte[]
和 String
数据)?以下是我想要的:
@XmlRootElement
public class Foo {
private @XmlElement List<Bar> bars;
}
@XmlRootElement
public class Bar<T> {
private @XmlValue T value; // (*)
}
但我得到了这个例外
(*) IllegalAnnotationException:
@XmlAttribute/@XmlValue 需要引用映射到 XML 中文本的 Java 类型。
The goal is to produce the following XML with JAXB
<foo>
<bar>string data</bar>
<bar>binary data</bar>
</foo>
Is there a workaround to allow generic @XmlValue
fields (I need to store byte[]
and String
data)? Below is what I desire:
@XmlRootElement
public class Foo {
private @XmlElement List<Bar> bars;
}
@XmlRootElement
public class Bar<T> {
private @XmlValue T value; // (*)
}
But I get this exception
(*) IllegalAnnotationException:
@XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对于此用例,您可以利用
XmlAdapter
而不是@XmlValue
:BarAdapter
Foo
The
XmlAdapter< /code> 使用
@XmlJavaTypeAdapter
注释与bars
属性关联:Bar
Demo
您可以测试此示例使用以下演示代码:
输出
请注意输出如何包含
xsi:type
属性以保留值的类型。如果您这样做,您可以通过让XmlAdapter
返回String
而不是Object
来消除xsi:type
属性您需要自己处理从String
到适当类型的转换,以进行解组操作:You could leverage an
XmlAdapter
for this use case instead of@XmlValue
:BarAdapter
Foo
The
XmlAdapter
is associated with thebars
property using the@XmlJavaTypeAdapter
annotation:Bar
Demo
You can test this example using the following demo code:
Output
Note how the output includes the
xsi:type
attributes to preserve the type of the value. You can eliminate the thexsi:type
attribute by having yourXmlAdapter
returnString
instead ofObject
, if you do this you will need handle the conversion fromString
to the appropriate type yourself for the unmarshal operation:我无法让
@XmlValue
工作,因为一路上我总是遇到NullPointerException
— 不知道为什么。我想出了类似下面的东西。完全删除您的
Bar
类,因为,当您希望它能够包含任何东西时,您可以简单地用Object
表示它。如果不告诉 JAXB 您的类型正在使用哪些命名空间,则
foo
内的每个bar
元素将包含单独的命名空间声明和内容 -package-info.java
所有命名空间的内容仅用于幻想目的。运行这个简单的测试会输出类似于 XML 片段的内容。
输出:
I couldn't get
@XmlValue
working as I always gotNullPointerException
along the way—not sure why. I came up with something like the following instead.Drop your
Bar
class entirely, because, as you want it to be able to contain anything you can simply represent it withObject
.Without telling JAXB which namespaces your types are using every
bar
element inside afoo
would contain separate namespace declarations and stuff—thepackage-info.java
and all the namespace stuff serves only fancification purposes only.Running this simple test would spout-out something similar to your XML snippet.
Output:
您是否有理由不简单地使用 byte[] 构造一个 String ?您真的需要通用吗?
Is there a reason you don't simply construct a String with your byte[]? Do you truly need a generic?
我通常使用的技巧是创建具有所需类型的模式,然后使用 xjc 生成 Java 类并查看如何使用注释。 :) 我相信在 XML 模式中,byte[] 的正确类型映射是“base64Binary”,因此创建如下模式:
并运行 xjc 我们将生成以下代码:
The trick I'm usually using is to create schema with types you want and then use xjc to generate Java classes and see how annotations are used. :) I believe in XML schema proper type mapping for byte[] is 'base64Binary', so creating schema like this:
and running xjc we would get following code generated: