我正在将旧版 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 服务可以做到这一点的其他方式感兴趣。