Java JAXB生成错误的类

Java JAXB生成错误的类,java,xsd,jaxb,jaxb2,Java,Xsd,Jaxb,Jaxb2,从xsd文件生成某些类后,这些类出现故障。 @xmlElementRef与required=“false”一起使用,不允许使用该属性。 我正在使用的My.xsd: <xs:schema xmlns:ns="http://shop.pau.softm.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://shop.pau.soft

从xsd文件生成某些类后,这些类出现故障。 @xmlElementRef与required=“false”一起使用,不允许使用该属性。 我正在使用的My.xsd:

<xs:schema xmlns:ns="http://shop.pau.softm.com/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" 
targetNamespace="http://shop.pau.softm.com/xsd">
  <xs:element name="checkOrder">
  <xs:complexType>
  <xs:sequence>
            <xs:element minOccurs="0" name="order" nillable="true" type="ns:Order"/>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
  <xs:complexType name="Order">
  <xs:sequence>
     <xs:element minOccurs="0" name="addressNumber" type="xs:int"/>
     <xs:element minOccurs="0" name="auftragsNummer" type="xs:int"/>
     <xs:element minOccurs="0" name="companyNumber" nillable="true" type="xs:string"/>
     <xs:element maxOccurs="unbounded" minOccurs="0" name="condition" nillable="true" type="ns:Condition"/>
     <xs:element minOccurs="0" name="currency" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="customerId" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="customerReference" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="deliveryAddress" nillable="true" type="ns:Address"/>
     <xs:element minOccurs="0" name="deliveryConditions" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="deliveryType" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="endCustomerId" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="endCustomerReference" nillable="true" type="xs:string"/>
     <xs:element maxOccurs="unbounded" minOccurs="0" name="error" nillable="true" type="ns:Error"/>
     <xs:element minOccurs="0" name="haltDescription" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="haltFlag" type="xs:boolean"/>
     <xs:element minOccurs="0" name="keySalesArea" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="openingHours" nillable="true" type="xs:string"/>
     <xs:element maxOccurs="unbounded" minOccurs="0" name="orderItem" nillable="true" type="ns:OrderItem"/>
     <xs:element minOccurs="0" name="origin" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="tourNumber" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="warehouseMan" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="warehouseNumber" type="xs:int"/>
     <xs:element minOccurs="0" name="wishedDeliveryDate" nillable="true" type="xs:string"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Condition">
  <xs:sequence>
     <xs:element minOccurs="0" name="description" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="value" nillable="true" type="xs:decimal"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="Address">
<xs:sequence>
     <xs:element minOccurs="0" name="city" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="country" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="createAddress" type="xs:boolean"/>
     <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="name2" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="name3" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="name4" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="street" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="zip" nillable="true" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="Error">
 <xs:sequence>
     <xs:element minOccurs="0" name="code" type="xs:int"/>
     <xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="origin" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
 <xs:complexType name="OrderItem">
   <xs:sequence>
     <xs:element minOccurs="0" name="additionalText" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="additionalText2" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="customerProductId" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="eanCodeOrderUnit" nillable="true" type="xs:string"/>
     <xs:element maxOccurs="unbounded" minOccurs="0" name="error" nillable="true" type="ns:Error"/>
     <xs:element minOccurs="0" name="haltDescriptionItem" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="price" nillable="true" type="xs:decimal"/>
     <xs:element minOccurs="0" name="productId" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" name="quantity" type="xs:double"/>
    </xs:sequence>
</xs:complexType>
<xs:element name="checkOrderResponse">
   <xs:complexType>
    <xs:sequence>
        <xs:element minOccurs="0" name="return" nillable="true" type="ns:Order"/>
     </xs:sequence>
  </xs:complexType>
 </xs:element>
<xs:element name="submitOrder">
<xs:complexType>
<xs:sequence>
        <xs:element minOccurs="0" name="order" nillable="true" type="ns:Order"/>
     </xs:sequence>
  </xs:complexType>
 </xs:element>
<xs:element name="submitOrderResponse">
<xs:complexType>
<xs:sequence>
        <xs:element minOccurs="0" name="return" nillable="true" type="ns:Order"/>
     </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

结果(部分)

package com.softm.pau.shop.xsd;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlementref;
导入javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“Address”,比例={
“城市”,
“国家”,
“创建地址”,
“姓名”,
“名称2”,
“名称3”,
“名称4”,
“街道”,
“拉链”
})
公共课堂演讲{
@xmlementref(name=“city”,名称空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
保护城市;
@xmlementref(name=“country”,名称空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
受保护国家;
受保护对象地址;
@XmlElementRef(name=“name”,命名空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
保护名称;
@XmlElementRef(name=“name2”,命名空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
保护名称2;
@XmlElementRef(name=“name3”,命名空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
保护名称3;
@XmlElementRef(name=“name4”,命名空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
受保护的名称4;
@xmlementref(name=“street”,名称空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
贝连街;;
@xmlementref(name=“zip”,名称空间=”http://shop.pau.softm.com/xsd,type=JAXBElement.class,必需=false)
保护带拉链;
如何获得XmlElement而不是XmlElementRef?在xsd中需要更改什么? xsd是从wsdl中提取的,我想使用生成的类来调用 网络服务

齐格弗里德

好的,这里有些mor信息,不能回答我自己的问题

我正在使用STS和Java6

<!-- JAXB-->
<taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
    <classpath>
        <fileset dir="lib/ct" includes="*.jar" />
    </classpath>
</taskdef>

<target name="gen.java" description="Generates the JAXB business objects">
    <xjc destdir="src/gen" extension="true">
        <schema dir="conf/webapp/WEB-INF/schema" includes="*.xsd" />
        <binding dir="resources" includes="*.xjb" />
    </xjc>
</target>

我的binding.xjb看起来像

<jxb:bindings version="1.0" 
 xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
 xmlns:s="http://www.w3.org/2001/XMLSchema" 
 xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jxb:extensionBindingPrefixes="xjc">

<jxb:bindings schemaLocation="../conf/webapp/WEB-INF/schema/wsinapa.xsd" node="/s:schema">
    <jxb:bindings node="/s:schema/s:element[@name='AccountStatus']">
        <jxb:class name="AccountStatusRequest"/>
    </jxb:bindings>
</jxb:bindings>

在src dir中有2.xsd应该编译。其中一个编译时没有 错误,另一个不是。两者都是从wsdl文件提取的

干杯

Siegfried

您的实现没有生成错误的类。已将
required
属性添加到JAXB 2.2中的
@xmlementref
注释中

很可能您已经在JavaSE7(包括JAXB2.2)中生成了JAXB类,并尝试在JavaSE6(包括JAXB2.1)中运行。使用JAXB2.2实现,您可以使用
-target
标志创建与JAXB2.1(或JAXB2.0)兼容的代码

xjc -target 2.1 schema.xsd

我认为在xsd中没有什么可以改变的。试着创建一个绑定文件,如下所示,比如simple-binding.xjb

<jaxb:bindings version="2.1" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
   <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 
因此,如果您使用运行XJC,您将不会获得标签
xmlementref

,您可能会遇到同样的问题。我通过在我的
pom.xml
中添加
<2.1
来修复它。如下所示:

<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <executions>
    <execution>
      ...
      <configuration>
        ...
        <specVersion>2.1</specVersion>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>

org.jvnet.jaxb2.maven2
maven-jaxb2-plugin
...
...
2.1
...

在我的项目中,同样的问题发生了,因为XSD文件中定义的一个类型的字段被复制。因此,JAXB无法生成正确的java类,因为java类中不能有两个同名字段。作为一种解决方法,JAXB给了我与原始帖子中相同的奇怪输出


我知道这个线程很旧,但是搜索类似问题的解决方案的人可能会发现这很有用。

然后像这样更新xjc参数:xjc-b simple-binding.xjb您是否尝试过像我提到的那样更新绑定文件?您需要在标记之间包含标记。是的,我做到了,是的,这解决了我的问题。非常感谢!!谢谢,为我解决了这个问题-不知道为什么这被否决了。
wsimport -b simple-binding.xjb
<plugin>
  <groupId>org.jvnet.jaxb2.maven2</groupId>
  <artifactId>maven-jaxb2-plugin</artifactId>
  <executions>
    <execution>
      ...
      <configuration>
        ...
        <specVersion>2.1</specVersion>
        ...
      </configuration>
    </execution>
  </executions>
</plugin>