【问题标题】:JAXB Binding With Java Inherited Bean ObjectJAXB 与 Java 继承的 Bean 对象绑定
【发布时间】:2016-12-21 07:32:53
【问题描述】:

我正在尝试使用 JAXB Api 将 XML 数据绑定到下面的 java 模型 bean 类。但我无法绑定它。任何人都可以使用 JAXB 提供建议或编码。 我已经提供了我的 bean 类并输入了 xml。

消息.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;
}
}

头文件.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));
}

}

【问题讨论】:

  • “但我无法绑定它” - 这是什么意思?您收到错误消息吗?确切的错误信息是什么?
  • 标头未与 ReqHeader 绑定。我的意思是我不能转换..线程“main”中的异常 java.lang.ClassCastException: com.conversion.Header 不能转换为 com.conversion.ReqHeader
  • @Jesper 我不知道如何处理这个问题。请帮助解决这个问题。

标签: java xml jaxb


【解决方案1】:

另一种方法是不使用继承,只使用 header 和 body 类,并删除 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 + "]";
}

}`

并相应地更改正文类...

【讨论】:

  • 谢谢恩比。但根据我的要求设计 Header 是 ReqHeader 的基类。 Body 是 RequestBody 的基类。这里的 ReqHeader & RequestBody 是针对特定服务的。每项服务的内容都会有所不同。 soi 必须遵循我的设计。
  • 你能根据我的设计给我一个建议吗。
【解决方案2】:

@XmlSeeAlso 注释的目的只是让您的 JAXB (JSR-222) 实现知道,当它处理 Resource 的元数据时,它还应该处理 SomeItem 类的元数据。

有些人错误地认为它与映射继承有关,因为这是最常使用的用例。

由于无法使用 Java 反射确定类的子类,因此使用 @XmlSeeAlso 让 JAXB 实现知道还应该创建子类的映射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多