java - wsimport 工具正在将生成的客户端代码中的 DataHandler 类型转换为 byte[]

标签 java web-services jaxb jax-ws

我有一个使用 JAXWS 开发的简单 WebService。我需要上传/下载一些文件。我创建了一个带有 DataHandler 属性的类 FileItem。服务运行良好。

但是当我使用 wsimport 工具生成客户端 stub 时,FileItem 类具有 byte[] 类型属性而不是 DataHandler 类型。

我如何自定义此行为,以便生成的代码在生成的客户端代码中也具有相同的 DataHandler 类型?

最佳答案

简答题

如果您在元素上指定 xmime:expectedContentTypes,除了:image/gifimage/jpeg text/xmlapplication/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[]ImageSourceDataHandler

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/

相关文章:

java - 为什么谓词 <? super SomeClass> 不适用于对象?

java - 使用hibernate向数据库添加数据的问题

java - 如何在 tomcat 6.0 中发布 Apache-Axis Web 服务

java - JAXB 泛型 @XmlValue

java - JAXB 仅解码 XML 文件的深层嵌套子集

java - JAXB 中 double 的几位小数

java - 具有递归类型参数的泛型类型以及抽象 self 方法如何允许方法链正常工作?

java - Gradle测试log4j.xml

web-services - 从 VBA 调用 Sharepoint Web 服务时,UpdateListItems 采用哪些参数?

c# - 通过 HttpClient 使用外部 REST Web 服务的存储库模式示例?