2010年6月17日木曜日

JDeveloperでJAX-WS Webサービスを作成する。

はい、お久しぶりです。
しばらくJDeveloperネタが続くと思うよ。

JDeveloper11.1.1.3.0でWebサービスを作成しよう。手順は簡単。
  1. プロジェクトを作成するときに「Webサービス」をテクノロジとして選択する。
  2. 普通にJavaクラスを作成する
  3. アプリケーション・ナビゲータでクラスを右クリックして「Webサービスの作成」を選択
  4. 出てきたウィザードでWebサービスを設定、生成
  5. するとクラスに@WebServiceアノテーションがついてWebサービス扱い
で、問題は5.のステップで同時にできあがるweb.xmlなんだな。
こんな感じ。












自分で作成した何でもないクラスがServletとしてservlet-classに登録されとる。Servletでも無いのに。

まさかコンパイル時にextends HttpServletするわけでもあるまい、実行時にどうにかしてんだろと思って(正確にはDannyと議論になったので)、Thread.dumpStack()してみたのである(スタックトレースは一番最後ね)。

そしたらweblogic.wsee.jaxws.JAXWSServletなるクラスを経由して、最終的にMethod#invoke()している。実はこれ、Sun 参照実装(これは初回Webサービス生成時にオプションで選択可能)の時にはcom.sun.xml.ws.transport.http.servlet.WSServletというクラスがservlet-classに指定されるので、まぁ似たような実装になるんだろうなと。

実際にはSun参照実装の場合はsun-jaxws.xmlが必要になって、そっちでWebサービスの実装クラスを指定するんだけどそれはそれで設定ファイルが増えちゃうかなーと。実際にはJDeveloperが勝手に管理するので問題無いと言えば問題は無い・・・。

<略>
at java.lang.reflect.Method.invoke(Method.java:597)
at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:92)
at weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:74)
at com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:151)
at com.sun.xml.ws.server.sei.EndpointMethodHandlerImpl.invoke(EndpointMethodHandlerImpl.java:265)
at com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:100)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:604)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:563)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:548)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:445)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:373)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:524)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:255)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:140)
at weblogic.wsee.jaxws.WLSServletAdapter.handle(WLSServletAdapter.java:208)
at weblogic.wsee.jaxws.HttpServletAdapter$AuthorizedInvoke.run(HttpServletAdapter.java:310)
at weblogic.wsee.jaxws.HttpServletAdapter.post(HttpServletAdapter.java:223)
at weblogic.wsee.jaxws.JAXWSServlet.doPost(JAXWSServlet.java:124)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at weblogic.wsee.jaxws.JAXWSServlet.service(JAXWSServlet.java:79)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
<以下略>


0 件のコメント: