我有一个带有cxf的spring boot soap服务,我的消费者正在http头中向我传递sso令牌。。我能够使用jax-ws处理程序检索sso令牌。我将sso令牌保存到处理程序类级别的变量中,在控制遍历各个类之后,它会到达一个点,即我必须向另一个服务发出请求,并且必须传递相同的sso令牌,但在我的连接类中,sso令牌值为空。
@Component
public class EndPointHandler implements SOAPHandler<SOAPMessageContext> {
private List<String> ssoToken;
private Map<String, List<String>> headers;
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean isResponse = (Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!isResponse) {
headers = ((Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS));
if (headers != null) {
if (!headers.get("SSOToken").get(0).isEmpty()) {
List<String> ssoToken = headers.get("SSOToken");
LOGGER.info(ssoToken.get(0));
this.ssoToken = ssoToken;
} else {
LOGGER.error("SSO Token value cannot be empty");
return false;
}
}
}
return true;
}
public void setSSOToken() {
headers.put("SSOToken", this.ssoToken);
}
}
在我的连接类中,我必须将这个sso令牌设置为头并调用另一个服务,但是sso令牌值为null。
连接等级:
@Component
public class ConnectionManager {
private static final Logger LOGGER = LoggerFactory.getLogger(ConnectionManager.class);
@Autowired
private EndPointHandler handler;
private void establishConnection(String uri) throws FileNetIntegrationException {
handler.ssoToken; // --> I need SSO token here but the value is NULL;
}
}
以下是我在webserviceconfig类中设置处理程序链的方式:
@Bean
public Endpoint endpoint(Bus bus) {
EndpointImpl endpoint = new EndpointImpl(bus, changeServiceEndpoint);
WebService ws = AnnotationUtils.findAnnotation(endpoint.getImplementorClass(), WebService.class);
endpoint.setAddress("/" + ws.serviceName());
endpoint.publish();
SOAPBinding binding = (SOAPBinding) endpoint.getBinding();
ArrayList<Handler> handlerChain = new ArrayList<>();
handlerChain.add(new EndPointHandler());
binding.setHandlerChain(handlerChain);
return endpoint;
}
2条答案
按热度按时间xbp102n01#
我想,在这里发布了最后一段代码之后,我发现在将其添加到处理程序链时使用了new endpointhandler(),就找到了一个解决方案。。我试着用自动连线,它为我工作。
o3imoua42#
据我所知,
jax-ws
上下文和spring-ws
上下文不相交。所以这不是一个解决方案,而是一个变通方法。作为另一种解决方法,您可以使用一些单例synchronizedMap
,或使用jax-ws
Handler
使用扩展api将请求重定向到另一个端点。使用jax-ws处理程序访问soap消息的http头
如果您已配置
SOAPHandler
为了你的JAX-WS
WebService
,然后可以访问http头并在SOAPBody
作为世界的田野SOAPElement
类型,反之亦然。为此,您必须使用注解为XmlElement
. 然后你可以从你的WebService
.注意:如果您有一个基于java类的动态生成的wsdl模式,那么它也会改变。但是无论如何,旧的请求和响应都会被接受,因为这些字段在默认情况下不是必需的。
例子:
UserService
-传入消息有一个字段String
类型和传出消息有一个字段int
类型。让我们用一个来扩展它们ssoToken
领域String
类型。我们将从传入消息的http头读取此令牌,并将其发送回传出消息的http头中。getuserrequest.java:
getuserresponse.java:
userservicehandler.java
处理输入消息:
ProcessOutgoing消息:
用户服务.java
使用soapui进行测试:
请求标头:
请求消息:
响应标头:
响应消息: