2014-12-01 3 views
1

제 3 자의 인터페이스를 사용하고 있으며 요청/응답 및 알림을위한 고유 한 XML 형식이 있습니다. XML은 다음과 같이해야합니다 :JAXB : 추상 클래스에 XML 태그 추가

<Message> 
    <Version>3.1</Version> 
    <Request> 
    <Request_Name> 
     <RequestID> Request ID </RequestID> 
     ... 
    </Request_Name> 
    </Request> 
</Message> 

Request 태그는 Notification 또는 Response 중 하나가 될 수 있습니다. 모두 Messages에는이 세 가지 중 하나만 있습니다. RequestResponse은 모두 RequestID입니다. ResponseReturnValue입니다. NotificationSession입니다.

중복을 방지하기 위해이 세 가지 유형 각각에 대해 추상적 인 클래스를 만들고 싶었습니다. 거의 작동합니다!

<Message> 
    <Version>3.1</Version> 
    <Request_Name> 
    <RequestID> Request ID </RequestID> 
    ... 
    </Request_Name> 
</Message> 

참고 누락 된 Request 태그 : 내가 마샬이 같은 외모에서와 비 정렬 화는 할 수있다! NotificationResponse과 동일합니다. 모든 정보가 있지만이 래퍼 태그가 나를 죽이고 있습니다!

[질문 : 내가 추상 클래스에 XML 태그를 넣을 수 있습니까? 아니면 비 추상적으로 만들고 다른 최상위 추상 클래스를 "실제"추상 기본 클래스로 만들 필요가 있습니까?

JAXB에 대한 많은 경험이 없으므로 간단한 방법이 필요합니다. 대신 XMLElement 메시지에서 request 필드를 만들려고했지만 Request_Name 태그를 Request으로 변경하고 형식 지정을 추가합니다.

내 코드는 기본적으로 아래와 같이 설정자와 CTOR을 간결하게 나타냅니다.

기본 Message 클래스 :

@XmlRootElement(name = "Message") 
public class Message { 
    @XmlElement(required = true, name = "Version") private String version; 
    private Request request; 
    private Response response; 
    private Notification notification; 

    @XmlElementRef(required = false) 
    public Request getRequest() { 
     return request; 
    } 

    @XmlElementRef(required = false) 
    public Response getResponse() { 
     return response; 
    } 

    @XmlElementRef(required = false) 
    public Notification getNotification() { 
     return notification; 
    } 
} 

추상 Request 클래스입니다.

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) 
public abstract class Request { 
    private String requestId; 

    @XmlElement(name = "RequestID", required = true) 
    public String getRequestId() { 
     return requestId; 
    } 
} 

Request 구현 :

@XmlRootElement(name = "RegForAllNotificationsRequest") 
public class RegForAllNotificationsRequest extends Request { 
    private long session; 
    private boolean register; 

    @XmlElement(name = "SessionToUse") 
    public long getSession() { 
     return session; 
    } 
    @XmlElement(name = "Register") 
    public boolean isRegister() { 
     return register; 
    } 
} 

이 같은 위의 정렬 화 뭔가 : NotificationResponse에 대한 유사

나는이 필요
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Message> 
    <Version>8.3</Version> 
    <RegForAllNotificationsRequest> 
     <RequestID>94668</RequestID> 
     <SessionToUse>548248</SessionToUse> 
     <Register>true</Register> 
    </RegForAllNotificationsRequest> 
</Message> 

:

<?xml version="1.0" encoding="UTF-8"?> 
<Message> 
    <Version>8.3</Version> 
    <Request> 
     <RegForAllNotificationsRequest> 
      <RequestID>94668</RequestID> 
      <SessionToUse>548248</SessionToUse> 
      <Register>true</Register> 
     </RegForAllNotificationsRequest> 
    </Request> 
</Message> 
,369을

답변

1

여기서 필요한 것은 요청이라는 태그 이름을 가진 RequestContainer 클래스입니다. 이 클래스에는 실제 요청 구현이 포함됩니다. 이것은 JAXB가 각 클래스를 별도의 태그로 렌더링하기 때문에 필요합니다. 태그 계층 구조는 클래스 계층 구조를 기반으로 작성되지 않습니다.

컨테이너 클래스는 다음과 같이 표시됩니다

@XmlRootElement(name = "Request") 
public class RequestContainer { 
    private Request request; 
} 

마찬가지로, NotificationResponse을 위해. Message 클래스에는 아래에 각각에 대한 컨테이너 클래스의 인스턴스가 포함됩니다.

@XmlRootElement(name = "Message") 
public class Message { 
    @XmlElement(required = true, name = "Version") private String version; 
    private RequestContainer request; 
    private ResponseContainer response; 
    private NotificationContainer notification; 

    @XmlElementRef(required = false) 
    public Request getRequest() { 
     return request; 
    } 

    @XmlElementRef(required = false) 
    public Response getResponse() { 
     return response; 
    } 

    @XmlElementRef(required = false) 
    public Notification getNotification() { 
     return notification; 
    } 
} 

희망이 있습니다.

+0

이것은 실제로 제가 결국에 가까워졌습니다. 나는 나의 해결책을 게시 할 것이지만 당신의 것을 정확하게 표시 할 것이다. – Dennis

관련 문제