摘要: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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="getDatosReturn" type="{http://beans.es}DatosBean"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </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;
}
}