Java JAXB复杂子XmlRootElement

Java JAXB复杂子XmlRootElement,java,jaxb,Java,Jaxb,我需要使用JAXB的以下格式输出 <?xml version="1.0" encoding="UTF-8"?> <tata-sky> <change-package-request> <sub-no>1064781105</sub-no> <ivr-id>ubona_7301341344310891411101430133</ivr-id> <date

我需要使用JAXB的以下格式输出

<?xml version="1.0" encoding="UTF-8"?>
<tata-sky>
    <change-package-request>
        <sub-no>1064781105</sub-no>
        <ivr-id>ubona_7301341344310891411101430133</ivr-id>
        <date-time>05/29/2013 00:16:13</date-time>
        <package-list>
            <package-ref>Punjabi Regional Free Pack</package-ref>
            <action-code>Delete</action-code>
        </package-list>
    </change-package-request>
</tata-sky>

ChangepackageRequest.java

package com.tsg.flow;

/**
 *
 * @author Shafiq
 */
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "tata-sky")
public class ChangePackage {

    //@XmlElement(name = "change-package-request", required = true)
    private ChangepackageRequest changePReq;


    public void setChangePReq(ChangepackageRequest changePReq) {
        this.changePReq = changePReq;
    }
  @XmlElement(name = "change-package-request")
    public ChangepackageRequest getChangePReq() {
        return changePReq;
    }
 private PackageRef packageList;


    public void setPackageList(PackageRef packageList) {
        this.packageList = packageList;
    }
@XmlElement(name = "package-ref")
    public PackageRef getPackageList() {
        return packageList;
    }

    public ChangePackage() {
    }
}
package com.tsg.flow;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 *
 * @author Shafiq
 */
@XmlRootElement(name = "change-package-request")
@XmlType(propOrder = {"sub_no", "ivr_id", "date_time"})
public class ChangepackageRequest {

    private String sub_no;
    private String ivr_id;
    private String date_time;

   /*  private PackageList packageList;


     public void setPackageList(PackageList packageList) {
     this.packageList = packageList;
     }
 @XmlElement(name = "package-ref")
     public PackageList getPackageList() {
     return packageList;
     }*/
    //@XmlElementWrapper(name = "change-package-request")    
    @XmlElement(name = "sub-no")
    public String getSub_no() {
        return sub_no;
    }

    public void setSub_no(String sub_no) {
        this.sub_no = sub_no;
    }

    @XmlElement(name = "ivr-id")
    public String getIvr_id() {
        return ivr_id;
    }

    public void setIvr_id(String ivr_id) {
        this.ivr_id = ivr_id;
    }

    @XmlElement(name = "date-time")
    public String getDate_time() {
        return date_time;
    }

    public void setDate_time(String date_time) {
        this.date_time = date_time;
    }
}
package com.tsg.flow;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 *
 * @author Shafiq
 */
@XmlRootElement(name = "package-list")
@XmlType(propOrder = {"package_ref", "action_code"})
public class PackageRef {
        private String package_ref;
    private String action_code;
       // @XmlElementWrapper(name = "package-list")
    @XmlElement(name = "package-ref")
    public String getPackage_ref() {
        return package_ref;
    }

    public void setPackage_ref(String package_ref) {
        this.package_ref = package_ref;
    }

    //@XmlElementWrapper(name = "package-list")
    @XmlElement(name = "action-code")
    public String getAction_code() {
        return action_code;
    }

    public void setAction_code(String action_code) {
        this.action_code = action_code;
    }
}

PackageRef.java

package com.tsg.flow;

/**
 *
 * @author Shafiq
 */
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "tata-sky")
public class ChangePackage {

    //@XmlElement(name = "change-package-request", required = true)
    private ChangepackageRequest changePReq;


    public void setChangePReq(ChangepackageRequest changePReq) {
        this.changePReq = changePReq;
    }
  @XmlElement(name = "change-package-request")
    public ChangepackageRequest getChangePReq() {
        return changePReq;
    }
 private PackageRef packageList;


    public void setPackageList(PackageRef packageList) {
        this.packageList = packageList;
    }
@XmlElement(name = "package-ref")
    public PackageRef getPackageList() {
        return packageList;
    }

    public ChangePackage() {
    }
}
package com.tsg.flow;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 *
 * @author Shafiq
 */
@XmlRootElement(name = "change-package-request")
@XmlType(propOrder = {"sub_no", "ivr_id", "date_time"})
public class ChangepackageRequest {

    private String sub_no;
    private String ivr_id;
    private String date_time;

   /*  private PackageList packageList;


     public void setPackageList(PackageList packageList) {
     this.packageList = packageList;
     }
 @XmlElement(name = "package-ref")
     public PackageList getPackageList() {
     return packageList;
     }*/
    //@XmlElementWrapper(name = "change-package-request")    
    @XmlElement(name = "sub-no")
    public String getSub_no() {
        return sub_no;
    }

    public void setSub_no(String sub_no) {
        this.sub_no = sub_no;
    }

    @XmlElement(name = "ivr-id")
    public String getIvr_id() {
        return ivr_id;
    }

    public void setIvr_id(String ivr_id) {
        this.ivr_id = ivr_id;
    }

    @XmlElement(name = "date-time")
    public String getDate_time() {
        return date_time;
    }

    public void setDate_time(String date_time) {
        this.date_time = date_time;
    }
}
package com.tsg.flow;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 *
 * @author Shafiq
 */
@XmlRootElement(name = "package-list")
@XmlType(propOrder = {"package_ref", "action_code"})
public class PackageRef {
        private String package_ref;
    private String action_code;
       // @XmlElementWrapper(name = "package-list")
    @XmlElement(name = "package-ref")
    public String getPackage_ref() {
        return package_ref;
    }

    public void setPackage_ref(String package_ref) {
        this.package_ref = package_ref;
    }

    //@XmlElementWrapper(name = "package-list")
    @XmlElement(name = "action-code")
    public String getAction_code() {
        return action_code;
    }

    public void setAction_code(String action_code) {
        this.action_code = action_code;
    }
}

主要方法:ChangePackageService.java

package com.tsg.flow;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

/** 
 *
 * @author Shafiq
 */
public class ChangePackageService {

    public static void main(String... args) {
        // public String createXMLString() {
        ChangePackage objCP = new ChangePackage();
        ChangepackageRequest cr = new ChangepackageRequest();

        cr.setSub_no("1064781105");
        cr.setIvr_id("ubona_7301341344310891411101430133");
        cr.setDate_time("05/29/2013 00:16:13");
        PackageRef pl = new PackageRef();
        pl.setPackage_ref("Punjabi Regional Free Pack");
        pl.setAction_code("Delete");
        objCP.setPackageList(pl);
        objCP.setChangePReq(cr);


        // create JAXB context and instantiate marshaller
        JAXBContext context = null;
        Marshaller m = null;
        try {
            context = JAXBContext.newInstance(ChangePackage.class);
            m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            // Write to System.out
            //m.marshal(cs, System.out);
            // Write to File
            m.marshal(objCP, System.out);
        } catch (JAXBException ex) {
            System.out.println("Error XML Generation" + ex.getMessage());
            // System.out.println("Exception Occured during marshalling: " + ex.getMessage());

        }

        //  return "";
        //  }
    }
}

请大家尽早回复解决方案。谢谢

看起来您已经注释掉了
ChangepackageRequest
中的部分代码,该代码告诉JAXB,
包列表
更改包请求
的子项

@XmlElement(name = "package-ref")
public PackageList getPackageList() {`
你需要做的是

  • 取消对该代码的注释
  • 更新它以使用
    PackageRef
    类而不是
    PackageList
  • ChangePackage

    • 我找到了解决方案

      在ChangePakageRequest.java中

      "added @XmlType(propOrder = {""}))"
      
      所以
      @XmlType(proporter={”、“日期时间”、“ivr\U id”、“子编号”})

      因此,它假设package ref是change package request的子元素。

      您希望
      package ref
      元素是
      change package request
      的子元素,那么
      PackageRef
      不应该是
      ChangepackageRequest
      类的属性吗?您正在
      ChangePackage
      实例上设置它……这听起来并不是解决此问题的正确方法。将
      ChangeRequest
      中的
      PackageRef
      字段改为
      ChangeRequest
      是一个更好的解决方案!