5

ほとんど数百の wsdl ファイルがあります。クライアント jaxb クライアント クラスを作成するたびに、Jaxb はすべての日付/時刻フィールドを XMLGregorianCalender に自動的にマップします。多くのグーグル検索の後、別のバインディング ファイルを提供することが唯一の解決策であることがわかりました。

wsdl の場所は非常に多いため、提供したくありません。そうしないと、wsdl ごとに個別のバインディング ファイルを作成する必要があります。

以下は、私が使用したバインディングファイルです。

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" >
    <globalBindings>
        <javaType name="java.util.Date" xmlType="xsd:dateTime"  />
    </globalBindings>
</bindings>

Date 型の jaxb クラスを作成しましたが、Adapter1.java という名前のアダプターも自動的に作成しましたが、これは望ましくありません。私は独自のパッケージ構造を持っており、それから逸脱することはできません。

org.w3._2001.xmlスキーマ

このアダプターは日付を String から java.util.Date に変換しますが、コンバーターが XMLGregorianCalender から java.util.Date に変換する必要があるため、アプリケーションが失敗します。

だから、私はアダプタを自分で書いた

import java.util.Date;
import java.util.GregorianCalendar;

import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import java.util.Calendar;
import javax.xml.bind.annotation.adapters.XmlAdapter;



public class DateAdapter extends XmlAdapter<XMLGregorianCalendar, Date> {

    @Override
    public XMLGregorianCalendar marshal(Date date) throws Exception {
        GregorianCalendar gregorianCalendar = new GregorianCalendar();
        gregorianCalendar.setTime(date);
        XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);
        return xmlGregorianCalendar;
    }

    @Override
    public Date unmarshal(XMLGregorianCalendar xmlGregorianCalendar) throws Exception {
        return xmlGregorianCalendar.toGregorianCalendar().getTime();
    }

}

カスタマイズファイルを次のように変更しました:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.0" >
    <globalBindings>
        <javaType name="java.util.Date" xmlType="xsd:dateTime"
        parseMethod="DateAdapter.marshal"
            printMethod="DateAdapter.unmarshal" />
    </globalBindings>
</bindings>

次に、wsimport ツールを実行しましたが、失敗しました。

C:\Users\stuart\Desktop\code>wsimport -s src -d gen -b cust.txt http://localhost:8080/webservice-jaxws/DummyService?wsdl


parsing WSDL...


generating code...


compiling code...

C:\Users\stuart\Desktop\code\src\org\w3\_2001\xmlschema\Adapter1.java:13: cannot find symbol
symbol  : variable DateAdapter
location: class org.w3._2001.xmlschema.Adapter1
        return (DateAdapter.marshal(value));
                ^
C:\Users\stuart\Desktop\code\src\org\w3\_2001\xmlschema\Adapter1.java:17: cannot find symbol
symbol  : variable DateAdapter
location: class org.w3._2001.xmlschema.Adapter1
        return (DateAdapter.unmarshal(value));
                ^
2 errors
compilation failed, errors should have been reported

また、wsimport コマンドで指定されたようにカスタマイズ設定を cust.txt に保存し、DateAdapter クラスのソース ファイルも同じディレクトリに置きました。クラスはパッケージなしでした。以下は私のディレクトリ構造です。

³   cust.txt
³   DateAdapter.java
³   
ÃÄÄÄgen
³   ÃÄÄÄorg
³   ³   ÀÄÄÄw3
³   ³       ÀÄÄÄ_2001
³   ³           ÀÄÄÄxmlschema
³   ³                   Adapter1.class
³   ³                   
³   ÀÄÄÄwebservice
³       ÀÄÄÄjaxws
³           ÀÄÄÄgenerated
³                   GetBook.class
³                   GetBookResponse.class
³                   ObjectFactory.class
³                   package-info.class
³                   Book.class
³                   BookService.class
³                   BookServiceImpl.class
³                   ReturnBook.class
³                   ReturnBookResponse.class
³                   
ÀÄÄÄsrc
    ÃÄÄÄorg
    ³   ÀÄÄÄw3
    ³       ÀÄÄÄ_2001
    ³           ÀÄÄÄxmlschema
    ³                   Adapter1.java
    ³                   
    ÀÄÄÄwebservice
        ÀÄÄÄjaxws
            ÀÄÄÄgenerated
                    GetBook.java
                    GetBookResponse.java
                    ObjectFactory.java
                    package-info.java
                    Book.java
                    BookService.java
                    BookServiceImpl.java
                    ReturnBook.java
                    ReturnBookResponse.java
4

1 に答える 1

0

私のDateAdapterが実際に次のようになったことを除いて、あなたが行ったのと同じバインディング宣言を使用してこれを解決しました:

public class DateAdapter {

    private DateAdapter() {}

    public static String marshal(Date date) {
        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(date);
        return DatatypeConverter.printDateTime(cal);
    }

    public static Date unmarshal(String xmlDate) {
        return DatatypeConverter.parseDate(xmlDate).getTime();
    }
}

そして、それは魅力のように機能します。XML側にはdateTimeがあり、Java側にはjava.util.Dateがあります。私は実際に、Date の代わりに java.time.Instant を使用する別のものを作成しました。

于 2016-09-01T20:53:50.743 に答える