java soap 增加命名空间,如何在SOAP Envelope中添加命名空间decalarations

In my soap application, I'm using apache cxf.

Here's my code which will submit data to the server.

import org.apache.cxf.Bus;

import org.apache.cxf.BusFactory;

import org.apache.cxf.bus.spring.SpringBusFactory;

import org.apache.cxf.endpoint.Client;

import org.apache.cxf.frontend.ClientProxy;

import org.apache.cxf.interceptor.LoggingInInterceptor;

import org.apache.cxf.interceptor.LoggingOutInterceptor;

import org.apache.cxf.ws.security.wss4j.DefaultCryptoCoverageChecker;

import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;

import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;

SpringBusFactory bf = new SpringBusFactory();

URL busFile = Submission.class.getResource(WSSEC_XML);

File f = new File(busFile.getPath());

Bus bus = bf.createBus(busFile.toString());

BusFactory.setDefaultBus(bus);

BusFactory.setThreadDefaultBus(bus);

DefaultCryptoCoverageChecker coverageChecker = new DefaultCryptoCoverageChecker();

coverageChecker.setSignBody(true);

coverageChecker.setSignTimestamp(true);

coverageChecker.setEncryptBody(true);

coverageChecker.setSignAddressingHeaders(true);

MyClaimservice service = new MyClaimservice();

Myclaims port = service.getMyClaimsSoap11();

BindingProvider provider = (BindingProvider) port;

provider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, ENDPOINT_ADDRESS);

provider.getRequestContext().put(BindingProvider.SOAPACTION_URI_PROPERTY, SOAP_ACTION);

Client client = ClientProxy.getClient(port);

client.getOutInterceptors().add(new LoggingOutInterceptor());

client.getInInterceptors().add(new LoggingInInterceptor());

client.getInInterceptors().add(new WSS4JInInterceptor(getInProps()));

client.getOutInterceptors().add(new WSS4JOutInterceptor(getOutProps()));

client.getInInterceptors().add(coverageChecker);

SubmissionResponse response = port.submission(request);

My request data is formed like this.

....

....

....

I need to add additional namespace to . My expected data should be like this,

....

....

....

I tried adding those prefixes and namespace urls to DefaultCryptoCoverageChecker using Map and XpathExpressions. But seems like it does not made any changes to my request data.

Map prefixes = new HashMap();

prefixes.put("prefix1", "url1");

prefixes.put("prefix2", "url2");

prefixes.put("prefix3", "url3");

prefixes.put("prefix4", "url4");

prefixes.put("prefix5", "url5");

List xpaths = Arrays.asList(

new XPathExpression("//prefix1:Envelope", CoverageType.SIGNED),

new XPathExpression("//prefix2:Envelope", CoverageType.SIGNED),

new XPathExpression("//prefix3:Envelope", CoverageType.SIGNED),

new XPathExpression("//prefix4:Envelope", CoverageType.SIGNED),

new XPathExpression("//prefix5:Envelope", CoverageType.SIGNED));

DefaultCryptoCoverageChecker coverageChecker = new DefaultCryptoCoverageChecker();

coverageChecker.addPrefixes(prefixes);

coverageChecker.addXPaths(xpaths);

coverageChecker.setSignBody(true);

coverageChecker.setSignTimestamp(true);

coverageChecker.setEncryptBody(true);

coverageChecker.setSignAddressingHeaders(true);

Any help would be greatly appreciated.

Update 2:

I've tried Apache cxf's transformation feature.

Map outTransformMap = Collections.singletonMap("{http://schemas.xmlsoap.org/soap/envelope/}Envelope", "Envelope");

TransformOutInterceptor transformOutInterceptor = new TransformOutInterceptor();

transformOutInterceptor.setOutTransformElements(outTransformMap);

client.getOutInterceptors().add(transformOutInterceptor);

According to http://cxf.apache.org/docs/transformationfeature.html#TransformationFeature-JAX-WS, above code will remove that specific namespace from Envelope node. And I can also confirm it by seeing the xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/ is being removed from

I tried the reverse of transformOutInterceptor.setOutTransformElements(outTransformMap); by replacing it with transformOutInterceptor.setOutAppendElements(outTransformMap);, where the outTransformMap will now contains Collections.singletonMap("{url1 (which I need to add)}Envelope", "Envelope");. But it's not appending it as a new Namespace to Envelope. What am I doing wrong here.. Is it really difficult to add additional namespace to other than the default namesapce.

解决方案

After digging on cxf forums, I found the answer.

Map nsMap = new HashMap<>();

nsMap.put("prefix1", "url1");

nsMap.put("prefix2", "url2");

nsMap.put("prefix3", "url3");

nsMap.put("prefix4", "url4");

nsMap.put("prefix5", "http://www.w3.org/2001/04/xmlenc#");

Client client = ClientProxy.getClient(port);

client.getRequestContext().put("soap.env.ns.map", nsMap);

I would be appreciated if anyone know on how to do the same for

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值