如何在SOAPEnvelope中添加名称空间声明

问题描述 投票:5回答:2

在我的肥皂应用程序中,我正在使用apache cxf。

这是我的代码,它将数据提交到服务器。

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);

我的请求数据是这样形成的。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    ....
    ....
    ....
</soap:Envelope>

我需要向<soap:Envelope>添加其他名称空间。我的预期数据应该是这样,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prefix1="url1" xmlns:prefix2="url2" xmlns:prefix3:"url3">
    ....
    ....
    ....
</soap:Envelope>

我尝试使用Map和XpathExpressions将这些前缀和名称空间url添加到DefaultCryptoCoverageChecker。但似乎它并未对我的请求数据进行任何更改。

Map<String, String> prefixes = new HashMap<String, String>();

prefixes.put("prefix1", "url1");
prefixes.put("prefix2", "url2");
prefixes.put("prefix3", "url3");
prefixes.put("prefix4", "url4");
prefixes.put("prefix5", "url5");

List<XPathExpression> 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);

任何帮助将不胜感激。

更新2:

我已经尝试过Apache cxf的转换功能。

Map<String, String> outTransformMap = Collections.singletonMap("{http://schemas.xmlsoap.org/soap/envelope/}Envelope", "Envelope");
TransformOutInterceptor transformOutInterceptor = new TransformOutInterceptor();
transformOutInterceptor.setOutTransformElements(outTransformMap);
client.getOutInterceptors().add(transformOutInterceptor);

根据http://cxf.apache.org/docs/transformationfeature.html#TransformationFeature-JAX-WS,以上代码将从Envelope节点中删除该特定名称空间。而且我也可以通过查看xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/已从<soap:Envelope>中删除来确认它>

我尝试用transformOutInterceptor.setOutTransformElements(outTransformMap);代替transformOutInterceptor.setOutAppendElements(outTransformMap);,其中outTransformMap现在将包含Collections.singletonMap("{url1 (which I need to add)}Envelope", "Envelope");。但是,它没有将其作为新的命名空间附加到Envelope。我在这里做错了什么。是否真的很难向默认名称空间之外的<soap:Envelope>添加其他名称空间。

在我的肥皂应用程序中,我正在使用apache cxf。这是我的代码,它将数据提交到服务器。导入org.apache.cxf.Bus;导入org.apache.cxf.BusFactory;导入org.apache.cxf.bus.spring ....

java web-services soap cxf ws-security
2个回答
5
投票

在cxf论坛上进行挖掘之后,我找到了答案。


1
投票

您可以添加标题,如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.