2016-10-15 7 views
0

私は、Java Beanの2つのレベルのXML要素を1つのレベルにマッピングするのが困難に直面しています。ここに私のコンテキストがあり、私はこのような1つのXMLいます2つのXML要素レベルをXStreamまたはJAXBの1つのレベルにマップする方法はありますか?

<?xml version='1.0' encoding="utf-8" ?> 
<Employee> 
    <Data> 
     <CompanyId>1</CompanyId> 
     <FirstName>John</FirstName> 
     <LastName>Oliver</LastName> 
     <DOB>1986-21-07</DOB> 
    </Data> 
</Employee> 

そして、ここでは私のJava Beanがある:

@XStreamAlias("Employee/Data") 
public class Employee { 
    @XStreamAlias("CompanyId") private int companyId; 
    @XStreamAlias("FirstName") private String firstName; 
    @XStreamAlias("LastName") private String lastName; 
    @XStreamAlias("DOB")  private LocalDate birthDate; 
    public int getCompanyId() { return companyId; } 
    public void setCompanyId(int companyId) { this.companyId = companyId; } 
    public String getFirstName() { return firstName; } 
    public void setFirstName(String firstName) { this.firstName = firstName; } 
    public String getLastName() { return lastName; } 
    public void setLastName(String lastName) { this.lastName = lastName; } 
    public LocalDate getBirthDate() { return birthDate; } 
    public void setBirthDate(LocalDate birthDate) { this.birthDate = birthDate; } 
} 

は、私はちょうど私がしたい方法を説明するために、「/」で区切られたXML要素を入れますマップが、XStreamはこのようには動作しないようです。アノテーションを使用してマップする方法やカスタムコンバーターを作成する必要がありますか? JAXBでこのマッピングを行う方法を誰かが知っている場合は、歓迎します。

答えて

0

JAXB + eclipselink moxyを使用したソリューションが見つかりました。最初のEclipseLink依存'org.eclipse.persistence:org.eclipse.persistence.moxy:2.6.4'を追加して、あなたは私が行ったよう

-Djavax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

またはちょうどあなたの方法をメインに設定されているコマンドラインJVMパラメータを経由して渡す必要がある、あなたのアプリケーションでのEclipseLinkの実装を使用していることを確認する:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.time.LocalDate; 
import java.time.Month; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement(name = "Employee") 
public class Employee { 

    @XmlPath("Data/CompanyId/text()") private int companyId; 
    @XmlPath("Data/FirstName/text()") private String firstName; 
    @XmlPath("Data/LastName/text()") private String lastName; 
    @XmlPath("Data/DOB/text()")  private LocalDate birthDate; 

    public int getCompanyId() { return companyId; } 
    public void setCompanyId(int companyId) { this.companyId = companyId; } 
    public String getFirstName() { return firstName; } 
    public void setFirstName(String firstName) { this.firstName = firstName; } 
    public String getLastName() { return lastName; } 
    public void setLastName(String lastName) { this.lastName = lastName; } 
    public LocalDate getBirthDate() { return birthDate; } 
    public void setBirthDate(LocalDate birthDate) { this.birthDate = birthDate; } 

    public String toString() { 
     return String.format("{companyId: %d, firstName: \"%s\", lastName: \"%s\"}", companyId, firstName, lastName); 
    } 


    public static void main(String[] args) throws Exception { 

     System.setProperty("javax.xml.bind.context.factory", "org.eclipse.persistence.jaxb.JAXBContextFactory"); 

     Employee employee = new Employee(); 
     employee.setCompanyId(100); 
     employee.setFirstName("Michael"); 
     employee.setLastName("Hoffmann"); 
     employee.setBirthDate(LocalDate.of(1970, Month.JANUARY, 19)); 

     JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class); 
     StringWriter sw = new StringWriter(); 
     PrintWriter out = new PrintWriter(sw); 

     jaxbContext.createMarshaller().marshal(employee, out); 
     out.flush(); 
     String xml = sw.toString(); 
     System.out.println(xml); 

     InputStream in = new ByteArrayInputStream(xml.getBytes()); 


     Employee employee2 = (Employee) jaxbContext.createUnmarshaller().unmarshal(in); 
     System.out.println(employee2); 

    } 

}