online - xml to object java
JAXB: Necesita el prefijo del espacio de nombres para todos los elementos (6)
MSK,
¿Has intentado establecer una declaración de espacio de nombres para tus variables miembro de esta manera? :
@XmlElement(required = true, namespace = "http://example.com/a")
protected String username;
@XmlElement(required = true, namespace = "http://example.com/a")
protected String password;
Para nuestro proyecto, resolvió problemas de espacio de nombres. También tuvimos que crear NameSpacePrefixMappers.
Estoy usando Spring WebServiceTemplate para hacer una llamada al servicio web que utiliza JAXB para generar XML de solicitud. Mi requisito necesita todos los elementos (incluida la raíz) para tener un prefijo de espacio de nombres (solo hay un único espacio de nombres) en la solicitud SOAP.
Ej .:
<ns1:Login xmlns:ns1="www.example.com/a">
<ns1:username>abc</ns1:username>
<ns1:password>abc</ns1:password>
</ns1:Login>
Pero estoy recibiendo
<Login xmlns="www.example.com/a">
<username>abc<username>
<password>abc<password>
</Login>
xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="www.example.com/a" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ilreq="www.example.com/a" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Login">
<xs:sequence>
<xs:element name="username" type="xs:string"/>
<xs:element name="password" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Generado clase de Java de XSD
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Login", propOrder = {
"username",
"password"
})
@XmlRootElement
public class Login {
@XmlElement(required = true)
protected String username;
@XmlElement(required = true)
protected String password;
......
}
package-info.java
@javax.xml.bind.annotation.XmlSchema(
namespace = "www.example.com/a",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package authenticator.beans.login;
Desea saber cómo generar el XML de solicitud con el prefijo de espacio de nombre para todos los elementos, incluido el directorio raíz.
Otra forma es decirle al marshaller que use siempre un cierto prefijo
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() {
@Override
public String getPreferredPrefix(String arg0, String arg1, boolean arg2) {
return "ns1";
}
});''
marshaller.setProperty
solo funciona en el marshaller JAX-B de Sun. La pregunta era sobre el marcador JAX-B de SpringSource
, que no es compatible con setProperty
.
Estaba enfrentando este problema, solucionado al agregar paquete-información en mi paquete
y el siguiente código en él:
@XmlSchema(
namespace = "http://www.w3schools.com/xml/",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(prefix="", namespaceURI="http://www.w3schools.com/xml/")
}
)
package com.gateway.ws.outbound.bean;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
Resuelto agregando
@XmlSchema(
namespace = "http://www.example.com/a",
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(prefix="ns1", namespaceURI="http://www.example.com/a")
}
)
package authenticator.beans.login;
import javax.xml.bind.annotation.*;
en package-info.java
Tomó la ayuda de jaxb-namespaces-missing : Answer provided by Blaise Doughan
Para especificar más de un espacio de nombres para proporcionar prefijos, use algo como:
@javax.xml.bind.annotation.XmlSchema(
namespace = "urn:oecd:ties:cbc:v1",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
xmlns ={@XmlNs(prefix="cbc", namespaceURI="urn:oecd:ties:cbc:v1"),
@XmlNs(prefix="iso", namespaceURI="urn:oecd:ties:isocbctypes:v1"),
@XmlNs(prefix="stf", namespaceURI="urn:oecd:ties:stf:v4")})
... en package-info.java