1

我正在尝试使用 citrus-framework 进行简单的肥皂测试,但我无法让服务器接受该消息。经过一番挖掘,我发现发送的消息中不包含 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 声明(<?xml version="1.0" encoding="UTF-8"?>),将相同的消息直接发送到服务器和服务器进程没有它的请求与我运行柑橘测试时的结果相同(失败)。

有什么办法可以强制发送吗?在柑橘线程和春天搜索,但找不到解决方案。

我的 citrus-ws 配置文件:

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

1 回答 1

0

所以我发现默认情况下不会发送 xml 声明标签。可以通过将 WRITE_XML_DECLARATION 设置为 true 来发送,但找不到通过 citrus-context.xml 文件中的 bean 配置来发送的方法。

编辑:我能够通过 citrus-context.xml 中的 bean 配置来配置它,在这个答案的末尾进行了解释。

但是,我确实通过绕过 bean 配置文件并通过 POJO 配置所有内容来更改它。

所以这里是一步一步的:

POJO配置:

1.1。我为配置创建了一个类,在其中为消息工厂定义了 bean,并将 WRITE_XML_DECLARATION 设置为 true:

@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;
  }

1.2. 在同一个类上,我使用定义的消息工厂为soap客户端配置了bean:

@Bean
public WebServiceClient tClient() {
    return CitrusEndpoints.soap().client().keepSoapEnvelope(true)
                        .timeout(60000)
                        .messageFactory(messageFactory())
                        .build();
}

2.1。在我的测试类中,我使用ContextConfiguration注释来引用我创建的类,以及CitrusEndpointWebServiceClientConfig注释:

@ContextConfiguration(classes = { TestConfig.class })
public class MyTest extends TestNGCitrusTestDesigner  {

    @CitrusEndpoint
    @WebServiceClientConfig(requestUrl = "http://localhost:8880/WS.asmx")
    private WebServiceClient soapclient;

2.2. 然后是使用配置客户端的问题:

 soap().client(soapclient)
.send().messageType("XML")
.name("testsend")
.payload(new ClassPathResource("com/i/B.xml"));

之后,我确认请求正在发送 xml 声明标记并且服务器正在接受请求。

citrus-context.xml 配置(新)

在 citrus-context.xml 中,当配置消息工厂时,插入一个名为messageProperties的属性,类型为map并插入属性javax.xml.soap.write-xml-declaration并将其设置为true(POJO 我们使用WRITE_XML_DECLARATION,在 citrus -context 我们直接使用属性):

<bean id="soapMessageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="soapVersion">
        <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11" />
    </property>
    <property name="messageProperties">
        <util:map>
            <entry key="javax.xml.soap.write-xml-declaration" value="true"/>
        </util:map>
    </property>
</bean> 
于 2017-04-05T16:00:23.840 回答