2

別のマシンでコードを実行できるようにしたいTomcatサーバーで実行されている既存のJavaコードがいくつかあるため、Webサービスを検討しています。私は Web サービスに不慣れで、おそらくここで何か間違ったことをしていると思います。

Tomcat で JAX-WS Web サービスをデプロイする方法に関するいくつかのオンライン チュートリアルに従いました。Web サービス クラスを作成し、@WebService で注釈を付け、web.xml および sun-jaxws.xml ファイルを作成し、それらのファイル (および JAX-WS jar ファイル) を .war ファイルにパッケージ化し、それを Tomcat にデプロイしました。 . Tomcat を指すブラウザーで WSDL ファイルをロードできるため、これは機能しているようです。

私が問題を抱えているのはWebサービスクライアントです。まず第一に、データベースにマップされるサーバー側の既存のクラスがあります。クライアントが同じ既存のクラスを使用してインスタンスを作成し、Web サービスを呼び出して、オブジェクトをデータベースに格納できるようにしたいと考えています。しかし、サーバーの WSDL ファイルに対して wsimport コマンドを実行すると、多数の Java クラスが生成され、その多くは既存のクラスに似ています。既存のクラスの代わりにそれらを使用する必要があると思いますか? 私が混乱していない限り、コードの再利用についてはこれで十分です。これは非常に可能です。

これで、wsimport が生成したクラスを使用してクライアントを作成できました。しかし、コンパイルエラーが発生します。既存の Java クラスのフィールドの一部は、java.net.InetAddress 型です。しかし、何らかの理由で、wsimport は独自の InetAddress クラスを生成し、次のようになります。

package ems.server.webservices;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "inetAddress")
public class InetAddress {
}

ええ、それは何もないただのクラスです!だから私が言っているコンパイルエラーの多くは:

WSClient.java:37: setAddress(ems.server.webservices.InetAddress) in ems.server.webservices.NetworkAddress cannot be applied to (java.net.InetAddress)
    networkAddress.setAddress(InetAddress.getByName("1.1.1.1"));

java.net.InetAddress を作成しようとしていますが、wsimport によって生成された空のクラスを使用する必要があります。私はここで何か間違ったことをしているに違いありません。教えてください。

4

1 に答える 1

2

別のマシンでコードを実行できるようにしたいTomcatサーバーで実行されている既存のJavaコードがいくつかあるため、Webサービスを検討しています

このためのWebサービス?なんで?

まず第一に、データベースにマップされるサーバー側の既存のクラスがあります。クライアントが同じ既存のクラスを使用できるようにしたい....コードの再利用については以上です

本当に悪い考えです。Web サービスの目的はコードの再利用性ではなく、相互運用性です。使用しているプログラミング言語のセマンティクスを実際に保持するビジネス クラスを再利用しようとすることは、悪い習慣であるだけでなく、クライアントも制御するほとんどの単純な Web サービスでない限り、多くの問題を引き起こす可能性があります。

サーバーの WSDL ファイルに対して wsimport コマンドを実行すると、多数の Java クラスが生成されました。

を実行するwsimportと、Web サービス クライアントが Web サーバーと通信するために必要なアーティファクトがすべて作成されます。これには、SOAP マーシャリング/デマーシャリング中にクラスを変換するのに役立つすべてのスタブ クラスが含まれます。

しかし、コンパイルエラーが発生します。既存の Java クラスのフィールドの一部は、java.net.InetAddress 型です。

java.net.InetAddressJava 固有のクラスです。そもそもそれを公開するべきではありません。そのため、コード ジェネレーターは空の を作成しますjava.net.InetAddress

正直なところ、この作業を行うための直接的な答えを提供することはできません. InetAddress私があなたに与えることができる唯一のヒントは、フィールドに注釈を付ければ、@XmlTransientそれらは公開されWSDLず、その問題は発生しないということです。もちろん、このフィールドが必要かどうかはわかりません。おそらく、私の提案は役に立たないでしょう。

しかし、私のお勧めは、アプローチを切り替えることです。あなたは間違った道を進んでいます。唯一の推奨事項は、アプローチを変更することです。

于 2012-05-04T16:51:04.260 に答える