我正在开发一个Web应用程序,它显示由Java rest端点发送的json格式中包含的问题。问题有一个文本元素,但也可以包含二进制形式的附件(例如图片或电影)(见截图1)。在服务器上,数据以XML定义,用于使用工具xjc生成Java类。
现在应用程序的一般部分(即显示问题)可以工作但是我很难用数据URL技术显示图片,因为base64二进制文件存储为一个字节数组。因此,当我将value属性提供给img标记时,我得到了有符号的整数而不是ASCII字符:
(`<img src="data:image/jpeg;base64,-119,80,78,71,13`<img)
如果我在Java端点上打开调试透视图并检查问题的变量(参见screenshot2),这是可见的。
现在,我最初的想法是将值的数据类型从byte []更改为String,但由于我只是扩展了base64类型的XML,我怀疑这是明智之举。
我很感激你对此的看法
内容的xsd文件,它是“附件”的元素
<xs:element name="content">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
<xs:attribute name="filename" type="xs:string" use="required"/>
<xs:attribute ref="xml:lang"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
问题的示例定义
<question id="q1" type="yesno">
<text>Is the organizations...?</text>
<attachments>
<attachment id="q1a1pic" mime="image/jpeg">
<content filename="image.jpg" xml:lang="de>iVB....cut....
</content>
</attachments>
</attachments>
</question>
生成的类内容:
public class Content {
@XmlValue
protected byte[] value;
答案 0 :(得分:0)
结果是缺少一个拼图,这是一个自定义XML适配器。您可以扩展javax.xml.bind.annotation.adapters XMLAdapter类,并实现marshal()和unmarshal()来执行转换。
public class Base64Adapter extends XmlAdapter<byte[], String> {
@Override
public String unmarshal(byte[] v) throws Exception {
return Base64.getEncoder().encodeToString(v);
}
@Override
public byte[] marshal(String v) throws Exception {
return Base64.getDecoder().decode(v);
}
}
然后,使用xjc重新编译类,包括在bindings参数中的新适配器:"xjc.exe" -d "app\platform\src\main\java" -b src/main/resources/XMLBinding.xjc -p example.company.com src\main\resources\model.xsd
有关更多详细信息,请参见API。