1

JBoss で実行されているレガシー Web サービスを、Spring を使用して Jetty で実行するように移植しています。

これが私のWebサービスクラスです:

@WebService( serviceName = "Authentication" )
public class AuthenticationWebService
{
    @Resource
    private WebServiceContext context;

    public boolean authenticate( @WebParam( name = "clientRef" ) final String clientRef, @WebParam( name = "username" ) final String username, @WebParam( name = "password" ) final String password )
    {
         ... DO THE ACTUAL LOGIN - DB CALLS ETC

         // finally, store the username in the httpsession
         final HttpServletRequest request = (HttpServletRequest) context.getMessageContext().get( MessageContext.SERVLET_REQUEST );
         final HttpSession session = request.getSession();
         session.setAttribute( "FIELD_USERNAME", username );
    }
}

サービスを公開するために、Spring xml は次のようになります。

    <bean id="wsExporter" class="org.springframework.remoting.jaxws.SimpleHttpServerJaxWsServiceExporter">
        <property name="basePath" value="/webServices/"/>
        <property name="port" value="9494"/>
    </bean>

    <bean class="com.example.AuthenticationWebService" />

Web サービスは Jetty サーバーにエクスポートされ、(JaxWsPortProxyFactoryBean を使用する Junit クラスを介して) 呼び出すことができますが、request.getSession() で nullpointerexception が発生します。

「javax.xml.ws.servlet.request」は、context.getMessageContext() マップのエントリではないようです。

グーグルで検索したところ、すべての提案が、これがサーブレット要求を取得する正しい方法であることを示しています。おそらくSpringでサービスをエクスポートしている方法に何かありますか?

注 - http セッションから値を設定/読み取る際に、このレガシー サービスの動作を変更することはできませんし、変更したくもありませんが、Web サービスがこれを行うことができる他の方法に興味があります。

4

1 に答える 1

0

デフォルトでは、セッションは jaxws によって維持されません。セッションを取得する前に、この行を追加してください。

context.getMessageContext().put(javax.xml.ws.BindingProvider.SESSION_MAINTAIN_PROPERTY, true)
于 2013-01-03T15:58:44.273 に答える