【问题标题】:Java/XML problemJava/XML 问题
【发布时间】:2010-10-18 14:54:57
【问题描述】:

我在通过 Java 代码生成 XML 时遇到问题。我有一门针对SailingAvailabilityResponseMessage 的课程。在这个类中,还有几个其他类也用于我正在编写的方法中。这是SailingAvailabilityResponseMessage 类的外观:

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder={"type", "agency", "version", "release", "processingInfo", "advisoryMessage", "packageDescription", "sailingGroup", "registrationInformation"})
public class SailingAvailabilityResponseMessage {


 private ProcessingInfo processingInfo;
 private AdvisoryMessage advisoryMessage;
 private PackageDescription packageDescription;
 private SailingGroupResponse[] sailingGroup;
 private RegistrationInformation registrationInformation;


 String type;

 @XmlAttribute
 public String getType() {
  return type;
 }

我遇到的具体问题与SailingGroupResponse[] sailingGroup; 有关 SailingGroupResponse[] 继承自 sailingGroup。这是sailingGroup 的样子:

public class SailingGroup {

 private SailingDescription sailingDescription;

 public SailingDescription getSailingDescription() {
  return sailingDescription;
 }

 public void setSailingDescription(SailingDescription sailingDescription) {
  this.sailingDescription = sailingDescription;
 }

这是SailingGroupResponse[] 的样子:

import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder={"sailingInformation", "diningDetails", "modeOfTransportation", "currencyInfo", "packageDescription"})
public class SailingGroupResponse extends SailingGroup {

 private SailingInformation sailingInformation;
 private DiningDetails diningDetails;
 private ModeOfTransportation modeOfTransportation;
 private CurrencyInfo currencyInfo;
 private PackageDescription packageDescription;

我在生成 XML 时遇到的问题是我期望得到一个 <sailingGroup> 的标签,但后来我也得到了一个我不想要的标签 <sailingGroupResponse>,因为它不是其中的一部分我遵循的原始规格。我正在通过 WebSphere RDi 生成 XML。我使用的是 SOAP 1.2,但我尝试为其开发的业务伙伴使用的是 SOAP 1.1,因此我不能使用 JAX-WS 运行时,而是必须使用 JAX-RPC(apache AXIS 不允许我使用产生)。

是否有人熟悉 JAX-RPC 运行时以及与我所问的问题类似的问题?如果有人知道我可以访问的好网站以获取更多信息,我愿意进一步研究,尽管到目前为止我在找到答案方面没有取得太大成功。

谢谢,

卡伦

【问题讨论】:

    标签: java xml web-services jaxb


    【解决方案1】:

    如您所见,将多态性引入 JAXB 注释类通常会导致复杂性。

    试试这个:

    @XmlElement(type = SailingGroup.class)
    public SailingGroupResponse[] getSailingGroup() {
        return sailingGroup;
    }
    

    您可能还需要将@XmlType 添加到 SailingGroup。

    【讨论】:

      【解决方案2】:

      您确定 JAXB 正在生成 sailingGroupResponse 标记吗?当我运行以下精简示例时,我得到了合理的 XML:

      XML 输出

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <root>
          <sailingGroup/>
          <sailingGroup/>
      </root>
      

      演示代码

      import javax.xml.bind.JAXBContext;
      import javax.xml.bind.JAXBElement;
      import javax.xml.bind.Marshaller;
      import javax.xml.namespace.QName;
      
      public class Demo {
      
          public static void main(String[] args) throws Exception {
      
              SailingAvailabilityResponseMessage sarm = new SailingAvailabilityResponseMessage();
              SailingGroupResponse[] sgr = new SailingGroupResponse[2];
              sgr[0] = new SailingGroupResponse();
              sgr[1] = new SailingGroupResponse();
              sarm.setSailingGroup(sgr);
      
              JAXBElement<SailingAvailabilityResponseMessage> rootElement = new JAXBElement<SailingAvailabilityResponseMessage>(new QName("root"), SailingAvailabilityResponseMessage.class, sarm);
      
              JAXBContext jc = JAXBContext.newInstance(SailingAvailabilityResponseMessage.class, SailingGroup.class, SailingGroupResponse.class);
              Marshaller marshaller = jc.createMarshaller();
              marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
              marshaller.marshal(rootElement, System.out);
      
          }
      
      }
      

      SailingAvailabilityResponseMessage

      import javax.xml.bind.annotation.XmlAttribute;
      import javax.xml.bind.annotation.XmlType;
      
      @XmlType(propOrder = { "type", "sailingGroup"})
      public class SailingAvailabilityResponseMessage {
      
          private SailingGroupResponse[] sailingGroup;
      
          String type;
      
          public SailingGroupResponse[] getSailingGroup() {
              return sailingGroup;
          }
      
          public void setSailingGroup(SailingGroupResponse[] sailingGroup) {
              this.sailingGroup = sailingGroup;
          }
      
          @XmlAttribute
          public String getType() {
              return type;
          }
      
          public void setType(String type) {
              this.type = type;
          }
      
      }
      

      SalingGroupResponse

      public class SailingGroupResponse extends SailingGroup {
      
      }
      

      SailingGroup

      public class SailingGroup {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 2015-06-11
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多