我正在尝试使用柑橘框架进行简单的肥皂测试,但我无法让服务器接受该消息。经过一番挖掘后,我发现发送的消息中没有包含xml声明标记。
根据日志,应该发送:
02:06:21,600 DEBUG xml.XmlConfigurer| Using DOMImplementationLS:
org.apache.xerces.dom.CoreDOMImplementationImpl 02:06:21,623 DEBUG
ingClientInterceptor| Sending SOAP request 02:06:21,624 DEBUG
Logger.Message_OUT| <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/> <SOAP-ENV:Body>
但是从TCP / IP Monitor中我看到的是:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/><SOAP-ENV:Body>
因此根据记录器可以预期会出现这种情况,但是当检查通过管道的是什么时,它不是。
我已经确认缺少的是xml声明(&lt;?xml version =“1.0” encoding =“UTF-8”?&gt;),使用和不使用它直接向服务器发送相同的消息,服务器处理该请求,而不会产生与运行柑橘测试时相同的结果(失败)。
有没有办法强迫它被发送?搜索柑橘线和春天但找不到解决方案。
我的柑橘-ss conf:
<citrus-ws:client id="soapClient"
request-url="http://localhost:8880/WS.asmx" timeout="60000"
message-factory="soapMessageFactory"/>
java dsl块:
soap().client("soapClient")
.send()
.name("testsend")
.charset("UTF-8")
.contentType("text/xml")
.payload(new ClassPathResource("com/i/B.xml"));
答案 0 :(得分:0)
所以我发现默认情况下不会发送xml声明标记。可以通过将WRITE_XML_DECLARATION设置为true 来发送,但是无法通过citrus-context.xml文件中的bean配置找到方法。
编辑:我可以通过citrus-context.xml中的bean配置来配置它,在本答案的最后解释。
然而,我通过绕过bean配置文件并通过POJO配置所有内容来改变它。
所以这是一步一步:
POJO配置:
1.1。我为配置创建了一个类,在那里我为消息工厂定义了bean并将WRITE_XML_DECLARATION设置为true:
BlackBerry WebWorks
1.2。在同一个类中,我使用定义的消息工厂为soap客户端配置了bean:
@Bean(name = "messageFactory")
public SaajSoapMessageFactory messageFactory() {
SaajSoapMessageFactory smf = new SaajSoapMessageFactory();
smf.setSoapVersion(org.springframework.ws.soap.SoapVersion.SOAP_11);
Map<String, String> props = new HashMap<String, String>();
props.put(SOAPMessage.WRITE_XML_DECLARATION, Boolean.toString(true));
smf.setMessageProperties(props);
return smf;
}
2.1。在我的测试类中,我使用 ContextConfiguration 注释来引用我创建的类,以及 CitrusEndpoint 和 WebServiceClientConfig 注释:
@Bean
public WebServiceClient tClient() {
return CitrusEndpoints.soap().client().keepSoapEnvelope(true)
.timeout(60000)
.messageFactory(messageFactory())
.build();
}
2.2。然后是使用配置的客户端的问题:
@ContextConfiguration(classes = { TestConfig.class })
public class MyTest extends TestNGCitrusTestDesigner {
@CitrusEndpoint
@WebServiceClientConfig(requestUrl = "http://localhost:8880/WS.asmx")
private WebServiceClient soapclient;
之后我确认请求发送了xml声明标记,并且服务器正在接受请求。
citrus-context.xml配置(新):
在citrus-context.xml上,配置消息工厂时,插入名为 messageProperties 且属性为 map 的属性,并插入属性 javax.xml。 soap.write-xml-declaration 并将其设置为 true (POJO我们使用 WRITE_XML_DECLARATION ,在柑橘语境中我们直接使用该属性):
soap().client(soapclient)
.send().messageType("XML")
.name("testsend")
.payload(new ClassPathResource("com/i/B.xml"));