3

Metro /Jerseyを使用するTomcat6とGlassfish3.1.2の両方にアプリをデプロイしようとしましたが、自動生成されたGlassfishテストポータルを使用してアプリをテストする場合を除いて、WebServiceContextリソースにアクセスすると常にnullポインター例外が発生します。

これを検証するために私が書いた簡単なテスト方法は次のとおりです。

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@WebService
@Path("/test")
public class Test {
    @Resource
    WebServiceContext wsContext;

    @GET
    @Produces("text/plain")
    @Path("/hello")
    public String hello() {
        MessageContext mc = wsContext.getMessageContext();   // NULL POINT HAPPENS HERE!
        ServletContext servletContext = (ServletContext) 
                mc.get(
                        MessageContext.SERVLET_CONTEXT);
        String s = servletContext.getRealPath("/WEB-INF");
        return "Real Path: " + s;
    }
}

対応するweb-xml(主にEclipseによって自動生成されます)は次のとおりです。

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>WebApp</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

最も興味深いのは、Glassfishで生成されたURLにアクセスしてTestServiceをテストする場合です。

http://localhost:8080/WebApp/TestService?Tester

フォームを送信して「hello」メソッドをテスト/呼び出し、適切なファイルパスを生成する有効なWebServiceContextオブジェクトを取得できます。残念ながら、実際には次のようなHTTPGETリクエストを実行します

$curl -H "Accept: text/plain" http://localhost:8080/WebApp/jaxrs/test/hello

その結果、Testクラスの22行目(WebServiceContext)を指すnullポインタースタックトレースが生成されます。

WebサービスがGlassfishテストハーネスで機能するのに、実際のHTTPリクエストからは機能しないのはなぜですか?

アップデート:

次のようにGlassFishのデフォルトのXMLSOAPリクエストをGlassFishのデフォルトのURLに使用すると、Webサービスが完全に機能する(WebServiceContextが適切に挿入される)ことを確認できました。

$curl -X POST -d @req.xml http://localhost:8080/ZlotyGlassfish/TestService --header "Content-Type:text/xml" 

ここで、ファイル「req.xml」の内容は、WSDL定義に一致するリクエストです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:impl="http://impl.rest.webservice.webapp.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <impl:hello/>
   </soapenv:Body>
</soapenv:Envelope>

私の主な質問は、なぜこれがデフォルトのGlassFish実装で完全に機能するのかということですが、@ GETおよび@Path表記によって生成されたエンドポイントに適切なWebServiceContextオブジェクトが挿入されないのですか?

4

1 に答える 1

5

違いは、デフォルトの GlassFish 実装が JAX-WS SOAP ベースのWeb サービスであることです。JAX-RS Web サービスの場合、次のアノテーションを使用してコンテキストを注入する必要があります。

 @Context 
 private ServletContext sc;

、 など、 @Context アノテーションを使用して注入できる他のタイプがありUriInfoますHttpHeaders。詳細については、 Jersey のドキュメントを参照してください。WebServiceContextおよびMessageContextJAX-RS コンテキストでは意味を持たない JAX-WS オブジェクトです。

于 2013-03-13T02:55:40.180 に答える