2016-05-12 13 views
1

私は、CRMとElastixコールセンターモジュールを統合するためにECCPプロトコルを使用しています。次のようにプロトコルが定義されたXML構造を使用しています。JAX-BカスタマイズされたXML出力

<request id="1"> 
    <request_type> <!-- this will be mapped to the Java request class --> 
     <attributes> 
     </attributes> 
    </request_type> 
</request> 

<response id="1"> 
    <response_type> <!-- this will be mapped to the Java response class --> 
     <attributes> 
     </attributes> 
    </response_type> 
</response> 

私はJavaクラスにXMLをマッピングするためにJAX-Bを使用していますが、問題は、私はJAX-を置く必要があるということですBはすべての要求でXMLを<request></request> XML内に生成し、すべての応答で<response></response>からコンテンツを抽出します。これは、ECCPプロトコルでは、すべての要求と応答をそれぞれの要素にネストする必要があるためです。ここで

は、私はそれを行うために使用しているコードです:

document = createDocument(); 
Element requestWrapper = document.createElement("request"); 
requestWrapper.setAttribute("id", String.valueOf(wrapped.getId())); 
document.appendChild(requestWrapper); 

JAXBContext jc = JAXBContext.newInstance(wrapped.getClass()); 
Marshaller marshaller = jc.createMarshaller(); 
marshaller.marshal(wrapped, requestWrapper); 

を例示する:

ECCPのプロトコル動作の

一つは、JAX-B-マッピングされ、このようなクラスの中にある(ゲッターとセッターは省略されました):

@XmlRootElement(name = "loginagent") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class EccpLoginAgentRequest implements IEccpRequest { 

    @XmlElement(name = "agent_number") 
    private String agentNumber; 

    @XmlElement(name = "password") 
    private String password; 
} 

そしてJAX-Bは、次を出力:

<loginagent> 
    <agent_number>username</agent_number> 
    <password>password</password> 
</loginagent> 

しかし、何ECCPのプロトコルが必要とすることである。

<request id="1"> <!-- id is an auto-increment number to identify the request --> 
    <loginagent> 
     <username>username</username> 
     <password>password</password> 
    </loginagent> 
</request> 

質問は次のとおりです。他のより良い方法で達成するための他の方法はありますか? ありがとうございます。

答えて

0

は、私がこの記事でこれを解決する方法を見つけました:XML element with attribute and content using JAXB

だから私は、次のようEccpRequestWrapperオブジェクトをマッピングしました:

@XmlRootElement(name = "request") 
public class EccpRequestWrapper { 
    @XmlAttribute 
    private Long id; 

    @XmlAnyElement 
    private IEccpRequest request; 
} 

、その後、私の要求JAX-Bは、道ECCP私の要求を出力しますプロトコルが必要です。 @XmlAttribute@XmlAnyElement注釈はやりました。

<request id="1"> 
    <login> 
     <username>user</username> 
     <password>****</password> 
    </login> 
</request> 

良いJAXBガイドはこちらhttps://jaxb.java.net/guide/Mapping_interfaces.html

1

@XmlSeeAlso注釈は、リクエストとレスポンスの両方で同じコンテンツをラップするのに役立ちます。内側の部分では、別のクラスを作成し、すべてのフィールドを適切にマップすることができます。これがあなたを少し助けてくれることを願っています。

EDIT: 応答時間が長いのは残念です。 @XmlElementとして定義された内部構造を持つラッパークラスを作成する必要があります。ここではそのXML構造を達成するための方法です:

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

@XmlElement(name = "loginagent", required = true) 
protected EccpLoginAgentRequest loginagent; 

public EccpLoginAgentRequest getLoginagent() { 
    return loginagent; 
} 

public void setLoginagent(EccpLoginAgentRequest loginagent) { 
    this.loginagent = loginagent; 
} 
} 

は、そしてここEccpLoginAgentRequest構造です:

JAXBContext jaxbContext = JAXBContext.newInstance(Wrapper.class); 
Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

EccpLoginAgentRequest request = new EccpLoginAgentRequest(); 
request.setAgentNumber("1"); 
request.setPassword("pass"); 

Wrapper wrapper = new Wrapper(); 
wrapper.setLoginagent(request); 

jaxbMarshaller.marshal(wrapper, System.out); 

@XmlAccessorType(XmlAccessType.FIELD) 
public class EccpLoginAgentRequest { 

@XmlElement(name = "agent_number") 
private String agentNumber; 

@XmlElement(name = "password") 
private String password; 

// getters and setters omitted 
} 

ので、結果では、あなたがそのようにしたいXMLを印刷することができますそれはあなたに次の出力を与えるでしょう:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<request> 
    <loginagent> 
     <agent_number>1</agent_number> 
     <password>pass</password> 
    </loginagent> 
</request> 
+0

[OK]を見つけることができ、私は@XmlSeeAlso注釈のドキュメントを見ていたが、私は、問題をよりよく説明するために、私の質問を向上させます。 – Jaumzera

+0

もう一度質問を確認できたら嬉しいです。前もって感謝します。 – Jaumzera

+0

もう一度@reallolに感謝します。ただし、EccpLoginAgentRequestオブジェクトを送信したときにのみ動作します。実際に必要なのは、EccpRequestを拡張する任意のクラスからオブジェクトを送信できることです。 – Jaumzera

関連する問題