Spring-ws没有在soap响应中保留CDATA

时间:2017-08-25 09:30:33

标签: spring web-services soap spring-ws

上下文

我正在使用Spring WS来生成链接中提到的Web服务:https://spring.io/guides/gs/producing-web-service/。但是,当我发送用CDATA包装的xml内容时,我得到了响应转义,这对非Java客户端造成了问题,因为他们希望元素内容在CDATA中并且所有内容都没有转义。

我试过

SaajSoapMessageFactory和 AxiomSoapMessageFactory(有效负载缓存设置为false)

配置

WebServiceConfig.java

@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext 
applicationContext) {
    MessageDispatcherServlet servlet = new MessageDispatcherServlet();
    servlet.setApplicationContext(applicationContext);
    servlet.setTransformWsdlLocations(true);
    return new ServletRegistrationBean(servlet, "/ws/*");
}

@Bean
public AxiomSoapMessageFactory messageFactory() {
    /*SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory();
    messageFactory.setSoapVersion(SoapVersion.SOAP_11);

    messageFactory.afterPropertiesSet();*/

    AxiomSoapMessageFactory messageFactory = new AxiomSoapMessageFactory();
    //messageFactory.
    messageFactory.setPayloadCaching(false);
    messageFactory.setSoapVersion(SoapVersion.SOAP_11);
    return messageFactory;
}

@Bean(name = "countries")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema 
countriesSchema) {
    DefaultWsdl11Definition wsdl11Definition = new 
DefaultWsdl11Definition();
    wsdl11Definition.setPortTypeName("CountriesPort");
    wsdl11Definition.setLocationUri("/ws");
    wsdl11Definition.setTargetNamespace("http://spring.io/guides/gs-
producing-web-service");
    wsdl11Definition.setSchema(countriesSchema);
    return wsdl11Definition;
}

@Bean
public XsdSchema countriesSchema() {
    return new SimpleXsdSchema(new ClassPathResource("countries.xsd"));
}

CountryRepository.java

@Component
public class CountryRepository {
private static final Map<String, Country> countries = new HashMap<>();

@PostConstruct
public void initData() {
    Country spain = new Country();
    spain.setName("Spain");
    spain.setCapital("<![CDATA[<a>Madrid</a>]]>");
    spain.setCurrency(Currency.EUR);
    spain.setPopulation(46704314);

    countries.put(spain.getName(), spain);

    Country poland = new Country();
    poland.setName("Poland");
    poland.setCapital("Warsaw");
    poland.setCurrency(Currency.PLN);
    poland.setPopulation(38186860);

    countries.put(poland.getName(), poland);

    Country uk = new Country();
    uk.setName("United Kingdom");
    uk.setCapital("London");
    uk.setCurrency(Currency.GBP);
    uk.setPopulation(63705000);

    countries.put(uk.getName(), uk);
}

public Country findCountry(String name) {
    Assert.notNull(name, "The country's name must not be null");
    return countries.get(name);
}
}

肥皂用户界面请求

&#13;
&#13;
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
				  xmlns:gs="http://spring.io/guides/gs-producing-web-service">
   <soapenv:Header/>
   <soapenv:Body>
      <gs:getCountryRequest>
         <gs:name>Spain</gs:name>
      </gs:getCountryRequest>
   </soapenv:Body>
</soapenv:Envelope>
&#13;
&#13;
&#13;

肥皂用户界面响应

&#13;
&#13;
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns2:getCountryResponse xmlns:ns2="http://spring.io/guides/gs-producing-web-service">
         <ns2:country>
            <ns2:name>Spain</ns2:name>
            <ns2:population>46704314</ns2:population>
            <ns2:capital>&lt;![CDATA[&lt;a>Madrid&lt;/a>]]&gt;</ns2:capital>
            <ns2:currency>EUR</ns2:currency>
         </ns2:country>
      </ns2:getCountryResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
&#13;
&#13;
&#13;

预期回复

&#13;
&#13;
<![CDATA[<a>Madrid</a>]]>
&#13;
&#13;
&#13;

问题

有人能说出我做错了什么以及如何纠正这种行为?

提前致谢。

0 个答案:

没有答案