Java ベースの Web サービスの作成
Java で直接サービスを手動実装することもできます。この場合、以下の Apache Ant スクリプトを使用して Web サービスプロジェクトを生成できます。
<Windchill>/bin/adminTools/WebServices/new-project.xml
(javaservice.type を使用)次に、service.type.id プロパティを指定する代わりに、service.class プロパティを使用して Java を実装するクラスを指定します。
例:
% cd <Windchill>
% mkdir prog_examples/jws/MyJavaProject
% ant -Dproject.dir=<Windchill>/prog_examples/jws/MyJavaProject
-Dservlet.name=MyJavaService
-Dsecurity.policy=userNameAuthSymmetricKeys -Dmain.class=org.myorg.MyJavaServiceClient
-Dservice.type=java -Dservice.class=org.myorg.MyJavaService
-f bin/adminTools/WebServices/new-project.xml create
新規プロジェクトを作成すると、新規 Web サービスの基本クラスが以下の場所に生成されます。
<Windchill>/prog_examples/jws/MyJavaProject/src/org/myorg/MyJavaService.java
これには、次のようなソースコードが含まれています。
package org.myorg;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.ptc.jws.servlet.JaxWsWebService;
@WebService()
public class MyJavaService extends JaxWsWebService
{
@WebMethod(operationName="add")
public int add ( int a, int b )
{
return a+b;
}
}
また、単に、add メソッドの例を独自の Web サービスのメソッドに置き換えることもできます。さらに、ほかの Web サービスのメソッドと必要なすべての補助クラスをプロジェクトの src ディレクトリ内に追加することもできます。次に、新しいサービスを以下のようにコンパイルし、パッケージ化して展開します。
% cd <Windchill>/prog_examples/jws/MyJavaService/src/
% ant
これにより、Web サービスがコンパイルされ、<Windchill>/codebase/WEB-INF/lib 内のサーブレット名に基づいて JAR ファイルでパッケージ化されます。また、これにより、プロジェクトを作成するときに指定したセキュリティポリシーを使用してセキュリティが確保されているサービスが展開されます。これで、Web サービスクライアントをJava ベースの Web サービスクライアントの作成で説明されている方法で実装できます。
Web サービスプロジェクトのクライアント部分を生成する場合、クライアントのソースコードの例は、コメントアウトされていなければ、コンパイルされない可能性があります (これは Web サービスクライアントのメインメソッドでコメントアウトされています)。クライアントによって生成されるソースコードは、当該 Web サービスが Info*Engine ベースであることを前提としています。次に、クライアントをコンパイルし、gensrc_client ディレクトリ内にあるクライアント側のソースコードのコンポーネントを検証してから、必要に応じてクライアントのソースを調整します。最後に、ant compile および ant dist コマンドを再実行して、クライアントを再コンパイルし、パッケージ化します。
Java ベースの Web サービスの作成についてさらに学習するには、標準の Java ドキュメンテーションの javax.jws、javax.xml.ws、および関連パッケージの説明を参照してください。これらは http://java.sun.com でダウンロードできます。
生成されたソースコードの例では、新しい Web サービスのクラスによって com.ptc.jws.servlet.JaxWsService が拡張されています。これは絶対要件ではありませんが、強く推奨されます。これにより、以下のような基本的な利便性がもたらされます。
$log インスタンス変数内における、暗黙的にインスタンス化された log4j ロガー (そのロガー名は Web サービスのクラス名に基づいて付けられている) へのアクセス。
ロガーで以下のようなメソッドを呼び出すだけで、メッセージのログ作成を行うことができます。
$log.debug (“my message”);
log4j を使用したログ作成の詳細については、http://logging.apache.org/log4j/ にある log4j のドキュメンテーションを参照してください。
javax.xml.ws.WebServiceContext インスタンス変数内における、Web サービスのリクエストに関連付けられている $wsc へのアクセス。
getMessageContext() メソッドを使用した、Web サービスのリクエストに関連付けられている javax.xml.ws.handler.MessageContext へのアクセス。
getServletRequest() メソッドを使用した、関連 javax.servlet.http.HttpServletRequest オブジェクトへのアクセス。このオブジェクトはサービスにアクセスするために使用される認証済みのユーザー名で適切に設定されている唯一の HttpServletRequest オブジェクトであるため、これは重要な点です。
* 
標準の Java ベースの Web サービスでは、MessageContext.SERVLET_REQUEST キーのもとに保存されている MessageContext オブジェクトを通じて HttpServletRequest オブジェクトにアクセスできます。オブジェクトをリクエストするためには、このサーブレットではなく、Web サービスの getServletRequest() メソッドを使用して返されたサーブレットを使用してください。HttpServletRequest オブジェクトを使用すると、コンフリクトが発生します。これは、Web サービスのリクエストを事前処理するセキュリティレイヤーがセキュリティ資格証明を受信 SOAP リクエストからセキュリティポリシーに基づいて抽出し、検証してから、javax.servlet.http.HttpServletRequestWrapper オブジェクトを使用してこれらの資格証明を設定するからです。"SERVLET_REQUEST" という MessageContext キーは不変プロパティであるため、セキュリティレイヤーは独自のバージョンの HttpServletRequest オブジェクトを MessageContext 内の別のキーのもとに保存する必要があります。このオブジェクトには、この HttpServletRequest オブジェクトの getRemoteUser() および getUserPrincipal() メソッドで設定された検証済みのユーザー名が提供されます。
これは役に立ちましたか?