OASは10gR3からJSR-181のWeb Services Metadata for the Java Platformに対応している。そのため、Webサービスの定義をJavaコードの中にアノテーションとして記述できる。
ただし、OASの10gR3は完全にJAX-WSをサポートしている訳ではなく、ベースはあくまでJAX-RPCなので、公開するWebServiceは必ず、サービス・エンドポイント・インターフェースを必要とする。そのインターフェースは必ずjava.rmi.Remoteを継承し、そのメソッドは必ず、java.rmi.RemoteExceptionをthrowする必要がある。
こんな感じ。
package org.hoge; import javax.jws.WebService; import javax.jws.WebMethod; import java.rmi.RemoteException; import java.rmi.Remote; @WebService(serviceName = "HogeWebService", targetNamespace = "http://webservice.hoge.org/HogeWebService") public interface Hoge extends Remote { @WebMethod public void hoge() throws RemoteException; }
で、実装クラスでは、@WebServiceアノテーションで、endpointInterfaceを指定する。
package org.hoge; import javax.jws.WebService; @WebService(endpointInterface = "org.hoge.Hoge") public class HogeImpl implements Hoge { public void hoge() { System.out.println("hello hoge"); } }
この場合、サービス・エンドポイント・インターフェースをimplementsしているがendpointInterfaceで指定しているため、必ずしもimplementsする必要は無い。また、endpointInterfaceを使用しているため、他のJSR-181ベースのメタアノテーションは定義できない。
続いて、WebServiceとしてビルドする。OASでは、WebServicesAssemblerというツールを使用する。このツールを使用すると、application.xmlやwebservices.xml、oracle-webservice.xmlを自動的に生成しパッケージングしたWebServiceデプロイ用のearアーカイブを生成してくれる。
target/classes直下にビルドしたクラスが存在する前提で、earアーカイブを作成するには、以下のようなbuild.xmlでantを行えば良い。
<?xml version="1.0" encoding="UTF-8"?> <project name="Hoge" default="build" basedir="." xmlns:oracle="antlib:oracle"> <!-- Task definitions for oc4j webservices tasks --> <target name="build"> <echo message="Creating the ear start..."/> <oracle:assemble appName="hoge-webservice" output="target" input="./target/classes" > <oracle:classpath location="target/classes"/> <oracle:porttype className="org.hoge.HogeImpl" interfaceName="org.hoge.Hoge"/> </oracle:assemble> <echo message="Creating the ear end."/> </target> </project>
実行するとtargetフォルダ直下にhoge-webservice.earが作成されている。後は、このearをOASにデプロイすればOK。