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 サービスがこれを行うことができる他の方法に興味があります。