2013-06-18 1 views
1

XML로 내보내려는 다소 큰 개체 트리가 있습니다. Person이라는 객체는 여러 장소에서 사용됩니다 (userCreated, 많은 자식 엔티티의 userModified, 클라이언트 등으로)JAXB/MOXy는 여러 속성에 대해 동일한 엔터티 형식을 사용합니다.

xml에 다른 요소가 있어야합니다. 예 :

사용자 생성 및 클라이언트가 동일한 개체의 인스턴스 (사람 이름)된다
<policy> 
    <userCreated> 
    <firstName>John</firstName> 
    <lastName>Doe</lastName> 
    </userCreated> 
    <client> 
    <clientId>1234</clientId> 
    <email>[email protected]</email> 
    <firstName>John</firstName> 
    <lastName>Doe</lastName> 
    </client> 
</policy> 

이이 bindings.xml에서 설정 할 수있는 방법

?

+0

은'Person' 클래스는 객체는 XML에 정렬 화되는 특성을 제한 할 나타납니다 위치에 따라 속성'clientId','email','firstName','lastName'하고있다? –

+0

예. 정확히 필요한 부분입니다. – yglodt

답변

0

EclipseLink JAXB (MOXy)@XmlNamedObjectGraph 확장을 사용하여이 사용 사례를 지원할 수 있습니다. @XmlNamedObjectGraph을 사용하면 데이터에 여러 개의보기를 만들 수 있습니다.

사람

우리는 단지 2 개 필드 (firstNamelastName)를 노출하는 Person 클래스 뷰를 만들 @XmlNamedObjectGraph를 사용하여 아래.

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.*; 

@XmlNamedObjectGraph(
    name = "simple", 
    attributeNodes = { 
     @XmlNamedAttributeNode("firstName"), 
     @XmlNamedAttributeNode("lastName") 
    } 
) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Person { 

    private int clientId; 
    private String firstName; 
    private String lastName; 
    private String email; 

    public void setClientId(int clientId) { 
     this.clientId = clientId; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

우리는 또한 Policy 클래스에 @XmlNamedObjectGraph를 사용 정책

. userCreated 필드의 경우 Person 클래스에 정의한 simple이라는 명명 된 개체 그래프를 적용합니다.

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlNamedObjectGraph(
    name = "policy", 
    attributeNodes = { 
     @XmlNamedAttributeNode(value = "userCreated", subgraph = "simple"), 
     @XmlNamedAttributeNode("client") 
    } 
) 
public class Policy { 

    private Person userCreated; 
    private Person client; 

    public void setUserCreated(Person userCreated) { 
     this.userCreated = userCreated; 
    } 

    public void setClient(Person client) { 
     this.client = client; 
    } 

} 

우리는 우리가 MarshallerProperties.OBJECT_GRAPH 속성을 사용하여 Marshaller에 적용하려는 명명 된 객체 그래프를 지정합니다 아래의 데모 코드에서 데모

. 다음은 출력

import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Policy.class); 

     Person person = new Person(); 
     person.setClientId(1234); 
     person.setFirstName("John"); 
     person.setLastName("Doe"); 
     person.setEmail("[email protected]"); 

     Policy policy = new Policy(); 
     policy.setClient(person); 
     policy.setUserCreated(person); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "policy"); 
     marshaller.marshal(policy, System.out); 
    } 

} 

데모 코드 실행의 출력입니다 자세한 내용

<?xml version="1.0" encoding="UTF-8"?> 
<policy> 
    <userCreated> 
     <firstName>John</firstName> 
     <lastName>Doe</lastName> 
    </userCreated> 
    <client> 
     <clientId>1234</clientId> 
     <firstName>John</firstName> 
     <lastName>Doe</lastName> 
     <email>[email protected]</email> 
    </client> 
</policy> 

+0

감사합니다. 외부 바인딩 문서를 사용하기 때문에 Person 객체에 대해 여러 xml-named-object-graph를 설정하고 (또는 내부에서 더 나은)? 주석을 피하고 외부 바인딩 문서 만 사용하려고합니다.또한 외부 바인딩 문서에서 가능한 한 많이 구성하고 Java에서 가능한 한 최소로 구성하려고합니다. – yglodt

+0

@yglodt - 다음 링크는 외부 매핑 문서에서 명명 된 객체 그래프를 구성하는 예제입니다. http://blog.bdoughan.com/2013/03/moxys-object-graphs-inputoutput-partial.html –