如何强制XML声明标记在ws上发送

如何强制XML声明标记在ws上发送,xml,soap,citrus-framework,Xml,Soap,Citrus Framework,我正在尝试使用citrus framework进行简单的soap测试,但无法让服务器接受消息。经过一番挖掘,我发现发送的消息中没有包含xml声明标记 根据日志,应发送: 02:06:21,600 DEBUG xml.XmlConfigurer| Using DOMImplementationLS: org.apache.xerces.dom.CoreDOMImplementationImpl 02:06:21,623 DEBUG ingClientInterceptor| Sending

我正在尝试使用citrus framework进行简单的soap测试,但无法让服务器接受消息。经过一番挖掘,我发现发送的消息中没有包含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>

因此,我发现默认情况下不会发送xml声明标记。可以通过将WRITE_XML_声明设置为true来发送,但无法通过citrus-context.XML文件中的bean配置来实现

编辑:我能够通过citrus-context.xml中的bean配置来配置它,这在回答的最后解释

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

下面是一步一步:

POJO配置:

1.1。我为配置创建了一个类,在该类中,我为消息工厂定义了bean,并将WRITE_XML_声明设置为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;
  }
2.1。在我的测试类上,我使用ContextConfiguration注释引用我创建的类,以及CitruseEndpoint和WebServiceClient配置注释:

@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声明标记,并且服务器正在接受请求

柑橘-context.xml配置(新):

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


因此我发现默认情况下不会发送xml声明标记。可以通过将WRITE_XML_声明设置为true来发送,但无法通过citrus-context.XML文件中的bean配置来实现

编辑:我能够通过citrus-context.xml中的bean配置来配置它,这在回答的最后解释

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

下面是一步一步:

POJO配置:

1.1。我为配置创建了一个类,在该类中,我为消息工厂定义了bean,并将WRITE_XML_声明设置为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;
  }
2.1。在我的测试类上,我使用ContextConfiguration注释引用我创建的类,以及CitruseEndpoint和WebServiceClient配置注释:

@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声明标记,并且服务器正在接受请求

柑橘-context.xml配置(新):

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


 soap().client(soapclient)
.send().messageType("XML")
.name("testsend")
.payload(new ClassPathResource("com/i/B.xml"));
<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>