2016-12-21 8 views
0

Я пытаюсь связать данные XML с ниже, чем java-модель bean-класса, используя JAXB Api. Но я не могу связать его. Кто-нибудь может дать предложение или кодирование с помощью JAXB. Я предоставил свой класс bean и input xml.JAXB Связывание с Java Inherited Bean Object

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, @XmlSeeAlso используется, чтобы позволить реализации JAXB знать, что также должны быть созданы сопоставления для подклассов.

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

Не могли бы вы дать мне предложение в соответствии с моим дизайном. –