3

仕様:-サーバー:Weblogic9.2はお客様によって修正されました。-顧客によって修正されたwsdlおよびxsdファイルによって定義されたWebサービス。変更は許可されていません。

やあ、

このプロジェクトでは、メールシステムを開発する必要があります。これは、Webサービスで一般的な作業を行う必要があります。ルート以外のxsd要素(wsdlではない)から自動生成されたクラスを受け取るBeanを作成します。このBeanはこの一般的な作業を行います。メールシステムは、xsdファイルで定義された要素を含むxmlを受信し、この要素情報をwsdlcで生成されたクラスにドロップする必要があります。このオブジェクトを使用すると、このインゲンマメを使用できます。メールリクエストをWebサービスにリダイレクトすることはできません。

WL9.2リソースでこれを行うためのコードを探しましたが、何も見つかりませんでした。現時点では、このアンマーシャリングにJAXBを使用しようとしました。

JAXBContext c = JAXBContext.newInstance(new Class[]{WasteDCSType.class});
Unmarshaller u = c.createUnmarshaller();
WasteDCSType w = u.unmarshal(waste, WasteDCSType.class).getValue();

Waste変数はDOMElementオブジェクトです。ルートがXSDに含まれていないため、ルート要素ではありません。

まず、自動生成されたクラスに引数なしのコンストラクターを追加する必要がありました。問題ありません。これを解決し、最終的にエラーなしでxmlをアンマーシャリングしました。しかし、属性に問題がありました。アンマーシャリングは属性を設定しませんでした。単純な属性でも、大きいまたは短い列挙属性でもない、どのクラスにもありません。どのタイプのxml要素でも問題ありません。

ObjectFactoryがwsldcによって作成されていないため、「コンテキスト文字列」(パッケージ名)からアンマーシャラーを作成することはできません。スキーマを設定すると、要素の説明が見つかりません。アンマーシャルがクラッシュします。

ビルドの内容は次のとおりです。

<taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="wsdlc" classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>    

 <target name="generate-from-wsdl">
        <wsdlc
            srcWsdl="${src.dir}/wsdls/e3s-environmentalMasterData.wsdl"
            destJwsDir="${src.dir}/webservices"
            destImplDir="${src.dir}/webservices"
            packageName="org.arc.eterws.generated"
            />
        <wsdlc
            srcWsdl="${src.dir}/wsdls/e3s-waste.wsdl"
            destJwsDir="${src.dir}/webservices"
            destImplDir="${src.dir}/webservices"
            packageName="org.arc.eterws.generated"
            />
    </target>

<target name="webservices" description="">
        <jwsc srcdir="${src.dir}/webservices" destdir="${dest.dir}" classpathref="wspath">
            <module contextPath="E3S" name="webservices">

                <jws file="org/arc/eterws/impl/IE3SEnvironmentalMasterDataImpl.java"
                        compiledWsdl="${src.dir}/webservices/e3s-environmentalMasterData_wsdl.jar"/>

                <jws file="org/arc/eterws/impl/Ie3SWasteImpl.java"
                        compiledWsdl="${src.dir}/webservices/e3s-waste_wsdl.jar"/>

                <descriptor file="${src.dir}/webservices/META-INF/web.xml"/>
            </module>

        </jwsc>
</target>

私の質問は次のとおりです。

  • WeblogicはどのようにJAX-RPC技術を使用してxmlを「アンマーシャル」し、xsd要素を使用して同じことを実行できますか?
  • はいの場合、どうすればこれを行うことができますか?
  • そうでない場合、この問題に対する複雑ではない解決策はありますか?
  • そうでない場合は、XMLBean技術を使用する必要があります。または、JAXB技術を使用してXSDを再生成します。最善の解決策は何ですか?

注:実際には、単一のxsdではなく、複雑なxsd構造があります。

4

1 に答える 1

1

メールサーバーが受信するxmlを指定するXSDがwsdlに含まれるxsdと同じである場合(文字通り、同じファイルであるか、意味的に同じ完全修飾名を持つことによって)、jaxbで生成されたクラスまっすぐに渡すことができるはずです。

そうでない場合は、メールサービスからのxmlblobをWebサービスに直接送信することはできません。しかし、それは大丈夫です、それがあなたのブローカーBeanの目的です。

実行中にxmlをアンマーシャルしてから、メールサーバーのアンマーシャルオブジェクトに基づいて新しいオブジェクト(wsdlで生成されたjaxbオブジェクト)を手動で作成します。

オブジェクト(メールとWebサービス)は論理的に同じである可能性があることを理解しています。魔法の接着剤を期待していますが、XMLはそれよりもはるかに厳密です。

Webサービスで生成されたクラスからJAXBアンマーシャラーを使用して、メールサービスからXMLをアンマーシャリングしようとしている場合も、スキーマが同一でない場合、これは完全に失敗します。

覚えておいてください。これは重要です。次の2つのxmlスニペットは、どれだけ使用したいかに関係なく、同じではありません。

<blob xmlns="urn:mailserver.schema.generated">
   <from>blah</from>
   <to>wop</to>
   <message>this is a message</message>
</blob>

<blob xmlns="urn:webservice.wsdl.generated">
   <from>blah</from>
   <to>wop</to>
   <message>this is a message</message>
</blob>
于 2011-02-02T15:51:03.983 に答える