鉴于java11不再支持webservice肥皂,我试图使用springboot使用肥皂服务。我试图按照这个链接的教程“https://spring.io/guides/gs/consuming-web-service/”。然而,我不是调用本地服务,而是调用一个wsdl为http://webservice.correios.com.br/service/rastro/Rastro.wsdl.的邮政服务。从这个wsdl maven正在生成类:BuscaEventos将是请求类,BuscaEventosResponse将是响应类。使用上面传递的wsdl,我能够通过soapUi生成一个调用,传递我在代码中使用的相同调用参数。然而,对于springboot,我在BuscaCliente类的最后一个命令中得到以下错误:
Caused by: org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested
exception is javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: it is not possible to do marshalling of the type
"com.example.spring.soap.schemas.BuscaEventos" as an element because it was not found in a annotation @XmlRootElement]
有趣的是,我不能把@XmlRootElement注释放在BuscaEventos类中,甚至因为它是由maven生成的。并且在教程中,不需要做任何进一步的步骤,或者修改生成的类。
除了教程之外,我唯一要做的就是将“schemas”文件夹(maven创建类的文件夹)设置为源文件夹。
这些是我的课程:
@SpringBootApplication
public class SoapApplication {
public static void main(String[] args) {
SpringApplication.run(SoapApplication.class, args);
}
@Bean
CommandLineRunner lookup(BuscaCliente cliente) {
return args -> {
BuscaEventosResponse response = cliente.getBusca();
System.out.println(response.getReturn().toString());
};
}
}
////////
@Configuration
public class BuscaConfig {
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
// this package must match the package in the <generatePackage> specified in
// pom.xml
marshaller.setContextPath("com.example.spring.soap.schemas");
return marshaller;
}
@Bean
public BuscaCliente buscaCliente(Jaxb2Marshaller marshaller) {
BuscaCliente client = new BuscaCliente();
client.setDefaultUri("http://webservice.correios.com.br/service/rastro/Rastro");
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
return client;
}
/////
public class BuscaCliente extends WebServiceGatewaySupport {
public BuscaEventosResponse getBusca() {
BuscaEventos request = new BuscaEventos();
request.setUsuario("ECT");
request.setSenha("SRO");
request.setTipo("1");
request.setResultado("T");
request.setLingua("101");
request.setObjetos("PY150825065BR");
System.out.println("Buscando objeto: " + request.getObjetos());
BuscaEventosResponse response = (BuscaEventosResponse) getWebServiceTemplate()
.marshalSendAndReceive("http://webservice.correios.com.br/service/rastro/Rastro", request,
new SoapActionCallback(""));
return response;
}
////这些是mavem从wsdl////生成的类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "buscaEventosResponse", propOrder = {
"_return"
})
public class BuscaEventosResponse {
@XmlElement(name = "return")
protected Sroxml _return;
/**
* Obtém o valor da propriedade return.
*
* @return
* possible object is
* {@link Sroxml }
*
*/
public Sroxml getReturn() {
return _return;
}
/**
* Define o valor da propriedade return.
*
* @param value
* allowed object is
* {@link Sroxml }
*
*/
public void setReturn(Sroxml value) {
this._return = value;
}
//////
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "buscaEventos", propOrder = {
"usuario",
"senha",
"tipo",
"resultado",
"lingua",
"objetos"
})
public class BuscaEventos {
protected String usuario;
protected String senha;
protected String tipo;
protected String resultado;
protected String lingua;
protected String objetos;
/**
* Obtém o valor da propriedade usuario.
*
* @return
* possible object is
* {@link String }
*
*/
public String getUsuario() {
return usuario;
}
/**
* Define o valor da propriedade usuario.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setUsuario(String value) {
this.usuario = value;
}
/**
* Obtém o valor da propriedade senha.
*
* @return
* possible object is
* {@link String }
*
*/
public String getSenha() {
return senha;
}
/**
* Define o valor da propriedade senha.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setSenha(String value) {
this.senha = value;
}
/**
* Obtém o valor da propriedade tipo.
*
* @return
* possible object is
* {@link String }
*
*/
public String getTipo() {
return tipo;
}
/**
* Define o valor da propriedade tipo.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setTipo(String value) {
this.tipo = value;
}
/**
* Obtém o valor da propriedade resultado.
*
* @return
* possible object is
* {@link String }
*
*/
public String getResultado() {
return resultado;
}
/**
* Define o valor da propriedade resultado.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setResultado(String value) {
this.resultado = value;
}
/**
* Obtém o valor da propriedade lingua.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLingua() {
return lingua;
}
/**
* Define o valor da propriedade lingua.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLingua(String value) {
this.lingua = value;
}
/**
* Obtém o valor da propriedade objetos.
*
* @return
* possible object is
* {@link String }
*
*/
public String getObjetos() {
return objetos;
}
/**
* Define o valor da propriedade objetos.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setObjetos(String value) {
this.objetos = value;
}
////这是pom. xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.sping</groupId>
<artifactId>soap</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>soap</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- tag::dependency[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- end::dependency[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- tag::profile[] -->
<profiles>
<profile>
<id>java11</id>
<activation>
<jdk>[11,)</jdk>
</activation>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
<!-- end::profile[] -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- tag::wsdl[] -->
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.13.2</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaLanguage>WSDL</schemaLanguage>
<generatePackage>com.example.spring.soap.schemas</generatePackage>
<schemas>
<schema>
<url>http://webservice.correios.com.br/service/rastro/Rastro.wsdl</url>
</schema>
</schemas>
</configuration>
</plugin>
<!-- end::wsdl[] -->
</plugins>
</build>
</project>
表示在你的BuscaEventos.java=