Создайте xml-строку для Java JAXB bean с корневым классом и внутренними классами, имеющими разные пространства имен

У меня есть корневой класс под названием Employee , который имеет два элемента empid и name и другой класс jaxb под названием Address . Ниже приведен пример фрагмента.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Request",propOrder = {
    "header",
    "body",
    "signature"
})
@XmlRootElement(name="Employee")
public class Employee
    implements Serializable
{

 @XmlElement(name = "Header", required = true)
    protected String empId;
    @XmlElement(name = "Body", required = true)
    protected String empName;
    @XmlElement(name = "Address", required = true)
    protected Address address;

.. setters and getters
}


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Address", propOrder = {
    "streetLine1",
    "streetLine2",
})
@XmlRootElement(name="Address",namespace= "http://www.w3.org/2000/09/xmldsig#")
public class Employee
    implements Serializable
{

    private final static long serialVersionUID = 100L;
    @XmlElement(name = "addressLine1", required = true)
    protected String addressLine1;
    @XmlElement(name = "addressLine2", required = true)
    protected String addressLine2;

//Setters and getters

}

Теперь, когда я генерирую строку XML с JAXB маршалинга я хочу ожидаемый результат, как это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Employee >

   <empId>124</empId>
   <empName>name</empName>

   <Address >
       <ns2:streetLine1 Id="line1"/>
       <ns2:streetLine2 Id="Line2"/>
   </Address>
</Request>

Пожалуйста предложите. Спасибо заранее.

1 ответ

  1. Есть некоторые проблемы с вашими классами JAXB, я думаю, что вы скопировали вставленные и изменили некоторые имена неправильно. Следующие элементы внутри @XMLTypeдолжны быть определены как @XMLElement.

    @XmlType(name = "Request",propOrder = {
        "header",
        "body",
        "signature"
    })
    

    В любом случае, предполагая, что классы правы. Вам потребуется 2 изменения для создания XML, который имеет элементы, упомянутые в другом пространстве имен.

    • Переместите пространство имен на уровень пакета с помощью @XMLSchema. i.E добавить пакет-info.java на уровне пакета для указания пространств имен.
    • Предоставьте Addressэлементу собственное пространство имен в Employeeклассе. Каждый элемент, если не в Родительском пространстве имен, должен быть переопределен на этом уровне.

    пакет-info.Ява

    @XmlSchema(
            namespace = "http://www.test.com",
            elementFormDefault = XmlNsForm.QUALIFIED)
    package int1.d;
    
    import javax.xml.bind.annotation.*;
    

    Работник.Ява

    package int1.d;
    
    import java.io.Serializable;
    
    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;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Request",propOrder = {
            "header",
            "body",
            "signature"
        })
    @XmlRootElement(name="Employee")
    public class Employee
        implements Serializable
    {
    
        private static final long serialVersionUID = 8293193254658211943L;
    
        @XmlElement(name = "Header", required = true)
        protected String empId;
        @XmlElement(name = "Body", required = true)
        protected String empName;
        @XmlElement(name = "Address", namespace="http://www.w3.org/2000/09/xmldsig#", required = true )
        protected Address address;
        public String getEmpId() {
            return empId;
        }
        public void setEmpId(String empId) {
            this.empId = empId;
        }
        public String getEmpName() {
            return empName;
        }
        public void setEmpName(String empName) {
            this.empName = empName;
        }
        public Address getAddress() {
            return address;
        }
        public void setAddress(Address address) {
            this.address = address;
        }
    }
    

    пакет-info.Ява

    @XmlSchema(
            namespace = "http://www.w3.org/2000/09/xmldsig#",
            elementFormDefault=XmlNsForm.QUALIFIED )    
    package int1.d2;
    
    import javax.xml.bind.annotation.*;
    

    Адрес.Ява

    package int1.d2;
    
    import java.io.Serializable;
    
    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;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "Address", propOrder = {
            "streetLine1",
            "streetLine2",
        })
    @XmlRootElement(name="Address")
    public class Address
        implements Serializable
    {
    
        private final static long serialVersionUID = 100L;
        @XmlElement(name = "addressLine1", required = true)
        protected String addressLine1;
        @XmlElement(name = "addressLine2", required = true)
        protected String addressLine2;
    
        public String getAddressLine1() {
            return addressLine1;
        }
        public void setAddressLine1(String addressLine1) {
            this.addressLine1 = addressLine1;
        }
        public String getAddressLine2() {
            return addressLine2;
        }
        public void setAddressLine2(String addressLine2) {
            this.addressLine2 = addressLine2;
        }
    
    
    }
    

    выход, генерируемый JAXB

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Employee  >
        <Header>124</Header>
        <Body>bae</Body>
        <ns2:Address>
            <ns2:addressLine1>line1</ns2:addressLine1>
            <ns2:addressLine2>line2</ns2:addressLine2>
        </ns2:Address>
    </Employee>