我有一个使用 JAXWS 开发的简单 WebService。我需要上传/下载一些文件。我创建了一个带有 DataHandler 属性的类 FileItem。服务运行良好。
但是当我使用 wsimport 工具生成客户端 stub 时,FileItem 类具有 byte[] 类型属性而不是 DataHandler 类型。
我如何自定义此行为,以便生成的代码在生成的客户端代码中也具有相同的 DataHandler 类型?
最佳答案
简答题
如果您在元素上指定 xmime:expectedContentTypes
,除了:image/gif
、image/jpeg
、 text/xml
或 application/xml
那么生成的属性将是 DataHandler
类型。
长答案
根据 JAXB 2.2 规范的 H.2.1.1 节绑定(bind)已知媒体类型,以下是 mime 类型如何对应于生成的 Java 类型。
MIME Type Java Type
--------- -------------
image/gif java.awt.Image
image/jpeg java.awt.Image
text/xml javax.xml.transform.Source
application/xml javax.xml.transform.Source
any other mime type javax.activation.DataHandler
XML 架构
下面是一个 XML 模式,其中包含许多 base64Binary
类型的元素,其中大部分都使用 xmime:expectedContentTypes
进行限定,因此我们可以看到对结果类的影响一代。
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
xmlns="http://www.example.com"
targetNamespace="http://www.example.com">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="default" type="xsd:base64Binary"/>
<xsd:element minOccurs="0" name="imageGif" type="xsd:base64Binary" xmime:expectedContentTypes="image/gif"/>
<xsd:element minOccurs="0" name="imageJpeg" type="xsd:base64Binary" xmime:expectedContentTypes="image/jpeg"/>
<xsd:element minOccurs="0" name="textXml" type="xsd:base64Binary" xmime:expectedContentTypes="text/xml"/>
<xsd:element minOccurs="0" name="applicationXml" type="xsd:base64Binary" xmime:expectedContentTypes="application/xml"/>
<xsd:element minOccurs="0" name="anythingElse" type="xsd:base64Binary" xmime:expectedContentTypes="anything/else"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
根(生成类)
下面是生成的类。生成的属性类型为 byte[]
、Image
、Source
和 DataHandler
。
package com.example;
import java.awt.Image;
import javax.activation.DataHandler;
import javax.xml.bind.annotation.*;
import javax.xml.transform.Source;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"_default",
"imageGif",
"imageJpeg",
"textXml",
"applicationXml",
"anythingElse"
})
@XmlRootElement(name = "root")
public class Root {
@XmlElement(name = "default")
protected byte[] _default;
@XmlMimeType("image/gif")
protected Image imageGif;
@XmlMimeType("image/jpeg")
protected Image imageJpeg;
@XmlMimeType("text/xml")
protected Source textXml;
@XmlMimeType("application/xml")
protected Source applicationXml;
@XmlMimeType("anything/else")
protected DataHandler anythingElse;
...
}
关于java - wsimport 工具正在将生成的客户端代码中的 DataHandler 类型转换为 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10297054/