web-dev-qa-db-ja.com

WebサービスでJAXBElement <String>を使用する方法は?

Javaクライアントから消費しているWCFを使用して相互運用可能なWebサービスを開発しています。プロキシクラスを作成すると、すべてのgetterおよびsetterメソッドとJAXBElement<String>フィールド。 JDK APIでこれを検索し、コンストラクターを見つけました。

JAXBElement(QName name, Class<T> declaredType, Class scope, T value) 

このコンストラクタをどのように使用すればよいですか?パラメータについて説明し、その使用法を説明する優れたチュートリアルがインターネット上にある場合はお知らせください。

25
Chintan Shah

この問題の解決策は、JAXBElementを作成するために別個のコンストラクターを作成する必要がないことです。尊敬される要素は、objectFactory.create........()メソッドから取得できます。応答オブジェクトに値を作成して設定し、引数がJAXBElementタイプのものであると仮定した場合、次のようにする必要があります。

someResponseObj.setMyValue(objectFactory.create.......()); 
/*method name that will be return a JAXBElement in setter()*/

注:生成されたコードには複数のObjectFactoryクラスが存在する可能性があるため、そのクラスに関連付けられている正確なクラスを参照する必要があるため、ObjectFactory参照を確認してくださいパッケージ。

27
Mukul Kumar

Javaクライアントを使用してWCF Webサービスを使用します。jaxwsmavenプラグインを使用してクライアント側コードを生成します。まったく同じことをしています。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <configuration>
        <packageName>com.package1</packageName>
        <sourceDestDir>src/main/Java</sourceDestDir>
        <wsdlDirectory>src/main/resources</wsdlDirectory>
        <wsdlFiles>
            <wsdlFile>wcf_webservice.wsdl</wsdlFile>
        </wsdlFiles>
    </configuration>
</plugin>

com.package1にObjectFactoryクラスが必要です。これを使用して、JAXBElementsを作成できます。例:

ObjectFactory factory = new ObjectFactory();
MyObject myObject = new MyObject();
JAXBElement<MyObject> elem = factory.createMyObject(myObject);

補足として、jaxwsで使用するにはwcf wsdlをフラット化する必要があります。

13
digital_age

誰かがここで解決策を探している場合に備えて:JAXBElementを使用する代わりに、バインディングファイルでgenerateElementPropertyをfalseに設定することにより、Typeのみを使用できます。

私の場合、私はmavenを使用してwsdlからスタブファイルを生成します。

部分的なpomファイルとバインディングファイル(この構成ではjavabindings.xmlと呼ばれます)

    <plugin>
        <groupId>org.Apache.cxf</groupId>
        <artifactId>cxf-codegen-plugin</artifactId>
        <version>2.2.9</version>
        <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
            <sourceRoot>${project.build.directory}/wsdl2Java/generated-sources/src/main/Java</sourceRoot>
            <wsdlOptions>
                <wsdlOption>
                    <wsdl>${basedir}/src/main/resources/yourWsdlFileOrURL.wsdl</wsdl>

                    <extraargs>
                        <extraarg>-verbose</extraarg>
                        <extraarg>-b</extraarg>
                        <extraarg>${basedir}/src/main/resources/javabindings.xml</extraarg>
                    </extraargs>                        
                </wsdlOption>
            </wsdlOptions>

            </configuration>
            <goals>
                <goal>wsdl2Java</goal>
            </goals>
        </execution>
        </executions>
    </plugin>
<jaxb:bindings version="2.0" 
xmlns:jaxb="http://Java.Sun.com/xml/ns/jaxb" 
xmlns:xjc="http://Java.Sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<jaxb:bindings schemaLocation="http://localhost:15002/MiddlewareDataServiceConversion?xsd=xsd0"> 
    <jaxb:bindings node="/xs:schema"> 
        <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 
13
Luis Rosa

私は同じ答えを探していたときにこの質問につまずいた。回答を投稿しましたが、いくつかの問題が見つかりました。これを行う方法は次のとおりです。

new javax.xml.bind.JAXBElement(
        new javax.xml.namespace.QName("http://locationOfURI", "nameOfElement"),
        javax.xml.bind.JAXBElement.class, 
        null, what your object's value is );

最後はJAXBElementの型パラメーターを意味します。

これがうまくいくことを願っています。

5
Tesnep

最初のパラメーターnameは、ミラーリングするXML要素の修飾名(ローカル名+名前空間)です。

declaredTypeは、XML要素をバインドするクラスのクラスオブジェクトです。

scopeはXML要素の使用範囲ですが、nullに設定できます。

declaredTypeクラスのインスタンスです。つまり、実際のJava実際のXML要素インスタンスにバインドされたオブジェクト。

1

使用方法はどこですか。例です。私はそれがほしい..

見つけた。だからあなたはそれをするかもしれない..それは動作します。

Text t = new Text();
t.setValue("I need limo transportation");
JAXBElement<Text> text = new JAXBElement(SERVICE, Text.class, t);
0
question

ドキュメントに従ってJAXBElementを使用して上記のメソッドを試すのに問題があり、代わりにこれを見つけました。

        import javax.xml.bind.*;

        JAXBContext jc = JAXBContext.newInstance(YOURCLASS.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(yourInstantiatedClass,  System.out);
0
James K

WsdlでminOccurs = "0"の代わりにminOccurs = "1"を使用するようにしてください。何らかの(正当な)理由により、コードジェネレーターは、パラメーターを基本的なJava typeパラメーターに変換するためにこの情報が必要です。

0
Mircea D.