1

我正在将旧版 Web 服务从在 JBoss 中运行移植到使用 Spring 在 Jetty 中运行。

这是我的网络服务类:

@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() 得到一个空指针异常。

看起来“javax.xml.ws.servlet.request”不是 context.getMessageContext() 映射上的条目。

用谷歌搜索,所有建议都指向这是获取 servlet 请求的正确方法。这可能是我用 Spring 导出服务的方式吗?

注意 - 我不能也不想改变这个遗留服务在设置/读取 http 会话值时的行为,但我会对 Web 服务可以做到这一点的其他方式感兴趣。

4

1 回答 1

0

By default sessions are not maintained by jaxws. Add this line prior to getting the session.

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