无法使用自动生成的clax和Jaxb2将肥皂响应映射到具体对象

时间:2018-12-10 13:41:39

标签: java spring web-services spring-boot soap

摘要:Soap发送带有xml的响应(例如下面的示例),但有些方法使我无法自动生成来自Jaxb2的clase数据。

我正在尝试使用以下配置从肥皂服务获取信息:

         <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <schemaLanguage>WSDL</schemaLanguage>
                    <generateDirectory>${project.basedir}/src/main/java</generateDirectory>
                    <generatePackage>es.infobd</generatePackage>
                    <schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
                    <schemaIncludes>
                        <include>*.wsdl</include>
                    </schemaIncludes>
                </configuration>
            </plugin>

在使用maven generate-sources生成Java clase之后,我实现了以下方法:

第一个效果很好,因为它是一个本机对象返回(字符串),如果我执行getIdEmpresa(nifCif).getGetIdEmpresaReturn()->它会返回一个正确的值。

public GetIdEmpresaResponse getIdEmpresa(String nifCif) {
        GetIdEmpresa request = new GetIdEmpresa();
        request.setNifCif(nifCif);
        log.info("getIdEmpresa " + nifCif);
        return (GetIdEmpresaResponse) getWebServiceTemplate().marshalSendAndReceive(
                infoBDEndPoint, request);
    }

当我尝试获取一个复杂的bean时,问题就来了,它返回的bean的所有属性均为空值。它表明我无法将响应映射到bean。 getDatos(id).getGetDatosReturn()->给我一个带有空属性的对象。

public GetDatosResponse getDatos(String id) {
        GetDatos request = new GetDatos();
        request.setId(id);
        return (GetDatosResponse) getWebServiceTemplate().marshalSendAndReceive(
                infoBDEndPoint, request);
    }

肥皂日志显示以下内容->

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <getDatosResponse xmlns="http://ws.infoDB.es">
      <getDatosReturn>
        <CPostal>30400</CPostal>
        <apellido1 xsi:nil="true" />
        <apellido2 xsi:nil="true" />
        <bep xsi:nil="true" />
        <cif>B30423376</cif>
        <codTipo>08</codTipo>
        <correoElectronico>100_1@gmail.com</correoElectronico>
        <domicilioSocial>Mi domicilio</domicilioSocial>
        <fax xsi:nil="true" />
        <idEmpresa>100</idEmpresa>
        <localidad>
          <codigo xsi:nil="true" />
          <descripcion xsi:nil="true" />
        </localidad>
        <localidadE xsi:nil="true" />
        <municipio>
          <codigo>30015</codigo>
          <descripcion>MunicipioXXX</descripcion>
        </municipio>
        <nif xsi:nil="true" />
        <nombre xsi:nil="true" />
        <numero>30</numero>
        <pagWeb>www.100_1.com</pagWeb>
        <provincia>
          <codigo>30</codigo>
          <descripcion>ProvinciaXXX</descripcion>
        </provincia>
        <provinciaE xsi:nil="true" />
        <razonSocial>Nombre100</razonSocial>
        <telefono>88888888</telefono>
        <tipTer>1</tipTer>
        <viaPub>
          <codigo>PA</codigo>
          <descripcion>Paraje</descripcion>
        </viaPub>
      </getDatosReturn>
    </getDatosResponse>
  </soapenv:Body>
</soapenv:Envelope>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header />
  <SOAP-ENV:Body>
    <ns2:getDatos xmlns:ns2="http://ws.infoDB.es" xmlns:ns3="http://beans.es">
      <ns2:id>100</ns2:id>
    </ns2:getDatos>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

因此我正在接收信息,但是由于某种原因jaxb2无法将其映射到我的bean。

您能给我一些解决方法吗?

我需要的东西:

//
// Este archivo ha sido generado por la arquitectura JavaTM para la implantación de la referencia de enlace (JAXB) XML v2.3.0 
// Visite <a href="https://javaee.github.io/jaxb-v2/">https://javaee.github.io/jaxb-v2/</a> 
// Todas las modificaciones realizadas en este archivo se perderán si se vuelve a compilar el esquema de origen. 
// Generado el: 2018.12.10 a las 01:58:18 PM CET 
//
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Clase Java para anonymous complex type.
 * 
 * <p>El siguiente fragmento de esquema especifica el contenido que se espera que haya en esta clase.
 * 
 * <pre>
 * &lt;complexType&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;sequence&gt;
 *         &lt;element name="getDatosReturn" type="{http://beans.es}DatosBean"/&gt;
 *       &lt;/sequence&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "getDatosReturn"
})
@XmlRootElement(name = "getDatosResponse")
public class GetDatosResponse {

    @XmlElement(required = true)
    protected DatosBean getDatosReturn;

    /**
     * Obtiene el valor de la propiedad getDatosReturn.
     * 
     * @return
     *     possible object is
     *     {@link DatosBean }
     *     
     */
    public DatosBean getGetDatosReturn() {
        return getDatosReturn;
    }

    /**
     * Define el valor de la propiedad getDatosReturn.
     * 
     * @param value
     *     allowed object is
     *     {@link DatosBean }
     *     
     */
    public void setGetDatosReturn(DatosBean value) {
        this.getDatosReturn = value;
    }

}

这是一个带有空值的符号

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DatosBean", namespace = "http://beans.es", propOrder = {
    "cPostal",
    "apellido1",
    "apellido2",
    "bep",
    "cif",
    "codTipo",
    "correoElectronico",
    "domicilioSocial",
    "fax",
    "idEmpresa",
    "localidad",
    "localidadE",
    "municipio",
    "nif",
    "nombre",
    "numero",
    "pagWeb",
    "provincia",
    "provinciaE",
    "razonSocial",
    "telefono",
    "tipTer",
    "viaPub"
})
@XmlSeeAlso({
    DatosDirBean.class
})
public class DatosBean {

    @XmlElement(name = "CPostal", required = true, nillable = true)
    protected String cPostal;
    @XmlElement(required = true, nillable = true)
    protected String apellido1;
    @XmlElement(required = true, nillable = true)
    protected String apellido2;
    @XmlElement(required = true, nillable = true)
    protected String bep;
    @XmlElement(required = true, nillable = true)
    protected String cif;
    @XmlElement(required = true, nillable = true)
    protected String codTipo;
    @XmlElement(required = true, nillable = true)
    protected String correoElectronico;
    @XmlElement(required = true, nillable = true)
    protected String domicilioSocial;
    @XmlElement(required = true, nillable = true)
    protected String fax;
    @XmlElement(required = true, nillable = true)
    protected String idEmpresa;
    @XmlElement(required = true, nillable = true)
    protected CodigoDescripcionBean localidad;
    @XmlElement(required = true, nillable = true)
    protected String localidadE;
    @XmlElement(required = true, nillable = true)
    protected CodigoDescripcionBean municipio;
    @XmlElement(required = true, nillable = true)
    protected String nif;
    @XmlElement(required = true, nillable = true)
    protected String nombre;
    @XmlElement(required = true, nillable = true)
    protected String numero;
    @XmlElement(required = true, nillable = true)
    protected String pagWeb;
    @XmlElement(required = true, nillable = true)
    protected CodigoDescripcionBean provincia;
    @XmlElement(required = true, nillable = true)
    protected String provinciaE;
    @XmlElement(required = true, nillable = true)
    protected String razonSocial;
    @XmlElement(required = true, nillable = true)
    protected String telefono;
    @XmlElement(required = true, nillable = true)
    protected String tipTer;
    @XmlElement(required = true, nillable = true)
    protected CodigoDescripcionBean viaPub;
 }

Spring配置:

@Configuration
public class InfoBDConfig {

    @Value("${infobd.endpoint}")
    private String infoBDEndPoint;

    @Bean
    public Jaxb2Marshaller marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("es.clients.infobd");
        return marshaller;
    }

    @Bean
    public InfobdClient infobdClient(Jaxb2Marshaller marshaller) {
        InfobdClient client = new InfobdClient();
        client.setDefaultUri(infoBDEndPoint);
        client.setMarshaller(marshaller);
        client.setUnmarshaller(marshaller);
        return client;
    }

}

0 个答案:

没有答案