首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用springboot webserver使用soap服务时发生马歇尔错误

使用springboot webserver使用soap服务时发生马歇尔错误
EN

Stack Overflow用户
提问于 2020-06-03 16:30:17
回答 1查看 1.2K关注 0票数 1

鉴于java 11不再支持webservice soap,我尝试使用springboot来使用soap服务。我试着学习这个链接"https://spring.io/guides/gs/consuming-web-service/“的教程。但是,我不是调用本地服务,而是调用一个其wsdl为http://webservice.correios.com.br/service/rastro/Rastro.wsdl的邮政服务。从这个wsdl生成类: BuscaEventos (请求类)和BuscaEventosResponse (响应类)。通过上面传递的wsdl,我能够通过soapUi生成一个调用,传递我在代码中使用的相同的调用参数。但是,对于springboot,在类BuscaCliente的最后一个命令中我得到了以下错误:

代码语言:javascript
复制
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创建类的文件夹)设置为源文件夹。

这是我的课:

代码语言:javascript
复制
@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());
        };
    }
}

/

代码语言:javascript
复制
@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;

}

/

代码语言:javascript
复制
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/生成的类。

代码语言:javascript
复制
@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;
}

/

代码语言:javascript
复制
@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

代码语言:javascript
复制
<?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>
EN

回答 1

Stack Overflow用户

发布于 2022-03-09 23:46:35

在您的BuscaEventos.java => @XmlRootElement(name = "buscaEventos")中表示

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62177874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档