3

JAXWSを使用して開発された単純なWebサービスがあります。いくつかのファイルをアップロード/ダウンロードする必要があります。DataHandlerプロパティを使用してクラスFileItemを作成しました。サービスは正常に実行されています。

しかし、wsimportツールを使用してクライアントスタブを生成したとき、FileItemクラスにはDataHandlerタイプではなくbyte[]タイプのプロパティがあります。

生成されたコードが生成されたクライアントコードでも同じDataHandlerタイプを持つように、この動作をカスタマイズするにはどうすればよいですか?

4

2 に答える 2

8

短い答え

、、、、またはxmime:expectedContentTypes以外の要素でを指定するとimage/gif、生成されるプロパティのタイプはになります。image/jpegtext/xmlapplication/xmlDataHandler


長い答え

セクションH.2.1.1JAXB2.2仕様の既知のメディアタイプのバインドから、以下は、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;


    ...
}
于 2012-04-24T19:21:09.847 に答える
0

wsimportは、DataHandlerオブジェクトをどのようにシリアル化する必要があるかを認識しておらず、バイト配列として必要であると想定しているようです。適切なXMLシリアル化のために、DataHandlerクラスで適切なjaxbアノテーションを使用してください。

于 2012-04-24T11:42:00.733 に答える