2016-12-13 4 views
0

サリュー、HttpServletRequest.getRemoteAddr()の実装は、私は、WebLogic Webサービスの実装に新しいですJAX-RPC

を使用して9.2.3。 JAX-RPCを使用してSOAPメッセージからクライアントのリモートアドレスを取得しようとしています。 SOAPメッセージヘッダからクライアントのリモートIPを取得する必要があります。 BEA/Oracleのドキュメントに従って多くのソリューションを試してみました。 のWebService Javaファイル:最後の一

@WebService 
public class clientsIPWs { 
    @Control 
    private SoapMessageControl smc; 

    @WebMethod 
    @WebResult(name="return") 
    public String getClientAddress() { 
     return smc.getRemoteAddress(); 
    } 

} 

SoapMessageControl.java

@ControlInterface 
public interface SoapMessageControl { 

    public String getRemoteAddress(); 

} 

SoapMessageControlImpl.java

@ControlImplementation 
public class SoapMessageControlImpl implements SoapMessageControl, Serializable { 
    private static final long serialVersionUID = 1L; 

    @Context 
    private SOAPMessageContext smc; 

    @WebMethod() 
    public String getRemoteAddress() { 
     HttpServletRequest request = 
      (HttpServletRequest) smc.getProperty("transport.http.servletRequest"); 
     return request.getRemoteAddr(); 
    } 
} 

は(この1つはあるのMessageContext/WebServiceContextのような@Contextで多くのバリエーションを試してみました非推奨)、テストのたびにそのような例外が発生しました:

はサービスにcontrols.SoapMessageControlBean.getRemoteAddressでcontrols.SoapMessageControlImpl.getRemoteAddressにおける方法 java.lang.NullPointerExceptionが(SoapMessageControlImpl.java:33) (SoapMessageControlBean.java:119) を起動に失敗しましたエンドコンポーネントを呼び出すことができませんでしたsun.reflect.DelegatingMethodAccessorImpl.invokeでsun.reflect.NativeMethodAccessorImpl.invokeでsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) (NativeMethodAccessorImpl.java:39) (AT .CustProdWs.getClientAddress(CustProdWs.java:63) DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at weblogic.wsee.component.pojo.JavaClassComponent.invoke(JavaClassComponent.java:99) at weblogic.wsee.ws.dispatch.server.ComponentHandler.handleRequest(ComponentHandler.java:64) at weblogic.wsee.handler。 HandlerIterator.handleRequest(HandlerIterator.java:127) weblogic.wsee.ws.dispatch.server.ServerDispatcher.dispatch(ServerDispatcher.java:85) weblogic.wsee.ws.WsSkel.invoke(WsSkel.java:80) weblogic.wsee.server.servlet.SoapProcessor.handlePost(SoapProcessor.java:66) weblogic.wsee.server.servlet.SoapProcessor.process(SoapProcessor.java:44) weblogic.wsee.server.servletで。 BaseWSServlet $ AuthorizedInvoke.run(BaseWSServlet.java:181) weblogic.wsee.server.servlet.BaseWSServlet.service(BaseWSServlet.java :weblogic.servlet.internal.StubSecurityHelper $ ServletServiceAction.runでjavax.servlet.http.HttpServlet.service(HttpServlet.java:856) で92) (weblogic.servlet.internal.StubSecurityHelperでStubSecurityHelper.java:227) weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175) でweblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) で.invokeServlet(StubSecurityHelper.java:125) でweblogic.servlet WebAppServletContext $ ServletInvocationAction.run(WebAppServletContext.java:3244) :121)weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImplでweblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:1916) でweblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2010) で0。 java:1366) weblogic.work.ExecuteThread.execute(ExecuteThread。Javaの:グーグルでweblogic.work.ExecuteThread.runで209) (ExecuteThread.java:181)

ほぼすべてのソリューションは、この枠組みの中で私のためには使用できませんJAX-WSを使用しています。おかげさまで

答えて

0

このソリューションは、私の仕事:

は、HttpServletRequestの/レスポンスオブジェクトに

を取得するWebサービスで転送プロトコルとしてHTTPを使用している場合、あなたは weblogic.wsee.connection.transportを使用することができます。 Bに示す次の例 (関連コードに示すように、JAX-RPC ServletEndpointContextオブジェクトからのjavax.servlet.http.HttpServletRequestと javax.servlet.http.HttpServletResponseのオブジェクトを取得するためのAPI servlet.HttpTransportUtils この例の後で説明します)。

package examples.webservices.http_transport_utils; 
import javax.xml.rpc.server.ServiceLifecycle; 
import javax.xml.rpc.server.ServletEndpointContext; 
import javax.xml.rpc.ServiceException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 
import weblogic.jws.WLHttpTransport; 
import weblogic.wsee.connection.transport.servlet.HttpTransportUtils; 
@WebService(name="HttpTransportUtilsPortType", 
      serviceName="HttpTransportUtilsService", 
      targetNamespace="http://example.org") 
@WLHttpTransport(contextPath="servlet", serviceUri="HttpTransportUtils", 
       portName="HttpTransportUtilsPort") 
public class HttpTransportUtilsImpl implements ServiceLifecycle { 
    private ServletEndpointContext wsctx = null; 
    public void init(Object context) throws ServiceException { 
    System.out.println("ServletEndpointContext inited..."); 
    wsctx = (ServletEndpointContext)context; 
    } 
    public void destroy() { 
    System.out.println("ServletEndpointContext destroyed..."); 
    wsctx = null; 
    } 
    @WebMethod() 
    public String getServletRequestAndResponse() { 
    HttpServletRequest request = 
     HttpTransportUtils.getHttpServletRequest(wsctx.getMessageContext()); 
    HttpServletResponse response = 
     HttpTransportUtils.getHttpServletResponse(wsctx.getMessageContext()); 
    System.out.println("HttpTransportUtils API used successfully."); 
    return "HttpTransportUtils API used successfully"; 
    } 
} 
関連する問題