2016-12-21 43 views
0

JAXB APIを使用して、JavaモデルBeanクラスの下にXMLデータをバインドしようとしています。しかし、私はそれを縛ることができません。誰でもJAXBを使って提案やコーディングをしてください。 私は自分のbeanクラスを提供し、xmlを入力しました。JAXB Java継承されたBeanオブジェクトとのバインド

Message.java

@XmlRootElement(name="Message") 
class Message{ 

private Header header = null; 
private Body body = null; 

@XmlElement(name="Header") 
public Header getHeader() { 
    return header; 
} 
public void setHeader(Header header) { 
    this.header = header; 
} 
@XmlElement(name="Body") 
public Body getBody() { 
    return body; 
} 
public void setBody(Body body) { 
    this.body = body; 
} 
} 

Header.Java

@XmlSeeAlso({ReqHeader.class}) 
class Header{ 

} 

ReqHeader.java

@XmlRootElement(name="Header") 
class ReqHeader extends Header{ 

private String msgID = null; 
private String msgDesc = null; 
public String getMsgID() { 
    return msgID; 
} 
public void setMsgID(String msgID) { 
    this.msgID = msgID; 
} 
public String getMsgDesc() { 
    return msgDesc; 
} 
public void setMsgDesc(String msgDesc) { 
    this.msgDesc = msgDesc; 
} 
} 

Body.java

class Body{ 

} 

RequestBody.java

class RequestBody extends Body{ 
private CustInfo custInfo = null; 
public CustInfo getCustrInfo() { 
    return custInfo; 
} 
public void setCustrInfo(CustInfo custInfo) { 
    this.custInfo = custInfo; 
} 
} 

CustInfo.java

class CustInfo{ 
private String custID = null; 
public String getCustID() { 
    return custID; 
} 
public void setCustID(String custID) { 
    this.custID = custID; 
} 
} 

MessageUnmarshallの.java

public class MessageUnmarshall { 

public static void main(String a[]) throws JAXBException{ 
    String str = "<Message> <Header> <MsgID>123</MsgID> <MsgDesc>cust  products</MsgDesc> </Header> <Body> <CustInfo> <CustID>111</CustID> </CustInfo> </Body> </Message>"; 
    JAXBContext context = JAXBContext.newInstance(Message.class); 
    Unmarshaller un = context.createUnmarshaller(); 
    Message msg = (Message) un.unmarshal(new StringReader(str)); 
} 

} 
+0

...それに応じて体のクラスを変更し、「しかし、私はそれをバインドすることができません」 - その平均値を何?エラーメッセージが表示されますか?正確なエラーメッセージは何ですか? – Jesper

+0

ヘッダーがReqHeaderとバインドされていません。私はキャストできないことを意味します。 スレッド "main"の例外java.lang.ClassCastException:com.conversion.Headerはcom.conversion.ReqHeaderにキャストできません –

+0

@Jesper私はこれにどのように対処するのか分かりません。この問題を解決するのを手伝ってください。 –

答えて

-1

だけでできるようにすることです@XmlSeeAlso注釈の目的は、あなたのJAXB(JSR-222)実装は、Resourceのメタデータを処理しているときにSomeItemクラスのメタデータも処理する必要があることを認識しています。

これは、それが最もよく使用されるユースケースであるため、継承マッピングに関連していると誤解している人がいます。

Javaリフレクションを使用してクラスのサブクラスを特定することはできないため、サブクラスのマッピングも作成する必要があることをJAXB実装に知らせるために@XmlSeeAlsoが使用されます。

0

代わりに、継承を使用せず、ヘッダーとボディクラスのみを使用し、ReqHeaderクラスとRequestBodyクラスを削除します。

このようなヘッダークラ​​スください:

@XmlRootElement(name = "Header") 
class Header { 
private String msgID = null; 
private String msgDesc = null; 

public String getMsgID() { 
    return msgID; 
} 

public void setMsgID(String msgID) { 
    this.msgID = msgID; 
} 

public String getMsgDesc() { 
    return msgDesc; 
} 

public void setMsgDesc(String msgDesc) { 
    this.msgDesc = msgDesc; 
} 

@Override 
public String toString() { 
    return "ReqHeader [msgID=" + msgID + ", msgDesc=" + msgDesc + "]"; 
} 

} `

+0

ありがとうEmbyy。しかし、私の要件設計通り、HeaderはReqHeaderの基本クラスです。 BodyはRequestBodyの基本クラスです。ここでReqHeader&RequestBodyは特定のサービス用です。内容はサービスごとに異なります。 Soiは私の設計に従わなければなりません。 –

+0

あなたは私のデザインに従って私に示唆を与えてくれますか? –

関連する問題