8

私は C# から来ているので、Java に多くの (優れた) 使いやすさの特徴や機能があるとは期待できないことはわかっていますが、最近この Java プロジェクトに参加したばかりで、まったく理解できません。このアウト。C# / .NET では、Web サービス プロキシ クラスと生成されたデータ コントラクトを作成するのは簡単なことではありませんでしたが、何らかの理由で、Web サービスの Java 実装は適切ではないように思えます。

これが取引です...

wsimport を使用して、生成された .java ファイルを .wsdl ファイルから作成します。例えば...

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin ".\wsdl\MyWSDL.wsdl"

wsdl の現在の場所 (「C:\Users\ME\etc\wsdl\MyWSDL.wsdl」) として、このハードコーディングされた (そのフレーズを入力すると吐きそうになりました) 「wsdlLocation」に気付きました。だから私はそれを取り出します:

"%JAVA_HOME%\bin\wsimport" -quiet -extension -s .\src -d .\bin -wsdllocation "NULL" ".\wsdl\MyWSDL.wsdl"

生成されたサービスをインスタンス化すると...

MyService xyz = new MyService();

エラーが発生します。「can't find file C:\blahblah\Temp\NULL」の行に沿った何か。わかりました... 製図板に戻ります。これを少し調べた後、wsdl の場所として "classpath:META-INF/WSDL.wsdl" を使用することについて話している Stack Overflow の投稿を見つけました。

"%JAVA_HOME%\bin\wsimport" ... -wsdllocation "classpath:WSDLs/MyWSDL.wsdl" ".\wsdl\MyWSDL.wsdl"
copy ".\wsdl\*" .\bin\WSDLs
cd bin
"%JAVA_HOME%\bin\jar" cf WebServiceProxies.jar *

エラー!

"Unknown protocol: classpath" 

奇妙なことに、Stack Overflow の投稿が回答としてマークされました。過去2年間で、「クラスパス:」がサポートされなくなったか、これを行う別の方法があるところまでかなりの量が変化した可能性があると思いますが、それを理解する/答えを見つけることができませんでした.

わかりましたので、答えが必要ないくつかの質問のうちの 1 つがあります (事前に感謝します!!!! ここで気が狂いそうです!)。

  1. 実行時に WSDL を必要としない方法はありますか? 価値があるのは、オブジェクトをインスタンス化するときにこれが必要なのはBSだと思います。この要件を抑制する方法はありますか? 別のツールを使っていたら…?

  2. このコードが実行時に WSDL を必要としないという方法がない場合、パッケージからこの WSDL を取得するにはどうすればよいですか? JAR ファイル内から WSDL をロードするには、wsdllocation 引数に何を入力すればよいですか?

4

1 に答える 1

1

wsdl-at-runtime-tragedyの必要性が私を悩ませることはなかったので、#1については答えがありません。とはいえ、パッケージ化されたwsdlの使用は、とにかく最後の手段になるはずです。公開されているwsdlエンドポイントを使用することを好みます。したがって、実際のwsdlの場所はhttp(s)://host/name_of_service?wsdl、ほとんどのホスティングフレームワークまたはhttp(s)://host/name_of_service.wsdlspring-ws用になります。

JavaベースのWebサービスクライアントプログラミングの複雑さについては、私のMavenベースのプロジェクトの1つからの小さな抜粋を示します。

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>2.6.1</version>
<executions>
    <execution>
        <id>generate-sources</id>
        <phase>generate-sources</phase>
        <configuration>
            <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
            <wsdlOptions>
                <wsdlOption>
                    <wsdl>https://XXXXXXXX/ws/loadsave?wsdl</wsdl>
                </wsdlOption>
            </wsdlOptions>
        </configuration>
        <goals>
            <goal>wsdl2java</goal>
        </goals>
    </execution>
</executions>

たぶん私はIDE中心ではないかもしれませんが、それは私にはかなり単純に思えます。Apache CXFは、最高のWebサービススタックの1つです。(ドキュメントにはFuse http://fusesource.com/docs/esb/3.5/fsf_se/JAXWSWSDLFirst.htmlを使用していますが、基本的には、はるかに優れたドキュメントでブランド変更されたCXFです。)

それがあなたの質問に答えることを願っています(少なくとも部分的に)。

java rantについて:必要がない限りMSツールを使用しませんが、嫌いなためではありません。私の仕事はどういうわけか私をより大きなプロジェクトに向かわせました、そしてハイエンド(あるいはそのことに関してはミッドレンジ)サーバーで.netサポートを見るのは非常にまれです。これは事実であり、Javaが.netよりも優れているわけではありません。しかし、MSに取り組む必要がある場合は、かなり早く慣れることができると確信しています。ですから、私のアドバイスは次のとおりです。あなたの仕事があなたに何か新しいことを学び、それを大切にする可能性を与えてくれたことを嬉しく思います。結局、私たちは新しいことを学びたいので、このビジネスに携わっています。

于 2012-06-27T05:35:03.010 に答える