java - none - los elementos esperados son<{}
JAXB unmarshall con espacios de nombres y prefijo (2)
Aquí es cómo puede manejar su uso cae:
Si necesita Envelope
elemento Envelope
paquete-información
Normalmente, usaría @XmlSchema
siguiente manera. Usar las propiedades de namespace
y elementFormDefault
como lo he hecho significa que todos los datos asignados a elementos XML a menos que se asignen de otra manera pertenecerán al http://www.xxxx.com/ncp/oomr/dto/
namespace. La información especificada en xmlns
es para la generación de esquemas XML, aunque algunas implementaciones de JAXB usan esto para determinar el prefijo preferido para un espacio de nombres cuando se hace una clasificación (ver: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes .html ).
@XmlSchema (
namespace="http://www.xxxx.com/ncp/oomr/dto/",
elementFormDefault=XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(prefix = "env", namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"),
@XmlNs(prefix="whatever", namespaceURI="http://www.xxxx.com/ncp/oomr/dto/")
}
)
package com.one.two;
import javax.xml.bind.annotation.*;
Sobre
Si dentro de com.one.two
necesita mapear elementos de un espacio de nombres que no sea http://www.xxxx.com/ncp/oomr/dto/
entonces debe especificarlo en las anotaciones @XmlRootElement
y @XmlElement
.
package com.one.two;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Envelope", namespace="http://schemas.xmlsoap.org/soap/envelope/")
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {
@XmlElement(name="Body", namespace="http://schemas.xmlsoap.org/soap/envelope/")
private Body body;
}
Para más información
Si solo quieres mapear el cuerpo
Puede usar un analizador StAX para analizar el mensaje y avanzar a la parte de carga útil y partir de allí:
import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;
public class UnmarshalDemo {
public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
StreamSource xml = new StreamSource("src/blog/stax/middle/input.xml");
XMLStreamReader xsr = xif.createXMLStreamReader(xml);
xsr.nextTag();
while(!xsr.getLocalName().equals("return")) {
xsr.nextTag();
}
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<Customer> jb = unmarshaller.unmarshal(xsr, Customer.class);
xsr.close();
}
}
Para más información
Estoy usando JAXB para analizar elementos xml de la respuesta SOAP. Definí las clases POJO para los elementos xml. He probado las clases pojo sin espacio de nombres y el prefijo funciona bien. Aunque estoy tratando de analizar con espacios de nombres y el prefijo frente a la siguiente excepción. El requisito es analizar la entrada del objeto SOAPMessage.
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://schemas.xmlsoap.org/soap/envelope/", local:"Envelope"). Expected elements are <{}Envelope>
Intenté solucionarlo creando @XMLSchema para el paquete en package-info.java y localicé este archivo en la carpeta del paquete. ¿Puede alguien guiarme para seguir adelante?
Remitió estas publicaciones pero no me ayudó.
EDITADO: XMLSchema
@javax.xml.bind.annotation.XmlSchema (
xmlns = { @javax.xml.bind.annotation.XmlNs(prefix = "env",
namespaceURI="http://schemas.xmlsoap.org/soap/envelope/"),
@javax.xml.bind.annotation.XmlNs(prefix="ns3", namespaceURI="http://www.xxxx.com/ncp/oomr/dto/")
}
)
package com.one.two;
Gracias por adelantado
Esto se puede hacer sin modificar el código JAXB generado utilizando la clase estándar SOAPMessage. Escribí sobre esto aquí y aquí
Es un poco complicado, pero funciona correctamente.
Marshalling
Farm farm = new Farm();
farm.getHorse().add(new Horse());
farm.getHorse().get(0).setName("glue factory");
farm.getHorse().get(0).setHeight(BigInteger.valueOf(123));
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Marshaller marshaller = JAXBContext.newInstance(Farm.class).createMarshaller();
marshaller.marshal(farm, document);
SOAPMessage soapMessage = MessageFactory.newInstance().createMessage();
soapMessage.getSOAPBody().addDocument(document);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
soapMessage.writeTo(outputStream);
String output = new String(outputStream.toByteArray());
Desmaterialización
String example =
"<soapenv:Envelope xmlns:soapenv=/"http://schemas.xmlsoap.org/soap/envelope//"><soapenv:Header /><soapenv:Body><ns2:farm xmlns:ns2=/"http://adamish.com/example/farm/"><horse height=/"123/" name=/"glue factory/"/></ns2:farm></soapenv:Body></soapenv:Envelope>";
SOAPMessage message = MessageFactory.newInstance().createMessage(null,
new ByteArrayInputStream(example.getBytes()));
Unmarshaller unmarshaller = JAXBContext.newInstance(Farm.class).createUnmarshaller();
Farm farm = (Farm)unmarshaller.unmarshal(message.getSOAPBody().extractContentAsDocument());