2016-04-13 26 views
0

我有一个XSD从我生成一些Java代码:从jaxb生成的代码中摆脱JAXBElement?

<xs:element name="full-account-v2" > 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

这已经好的工作,给我叫FullAccountV2生成的类。

我想在其他地方使用相同的复杂类型,所以我想我会创建XSD文件命名复杂类型,并指它是这样的:

<xs:element name="full-account-v2" type="fullAccountV2Type"/> 

复杂类型定义如下:

<xs:complexType name="fullAccountV2Type"> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

现在突然间解组停止工作。下面的XML是解组蛮好一个FullAccountV2:

<er-response id="100058" version="2"> 
    <payload> 
    <full-account-v2> 
    <ban>BAN_P146058461158163004</ban> 
    <status>401</status> 
    </full-account-v2> 
    </payload> 
</er-response> 

但现在,类不再出现,而XML是由JAXB解组到JAXBElementQnamefull-account-v2declaredTypeFullAccountV2Type

ErResponse和有效载荷在别处定义为:

<xs:complexType name="payloadType"> 
    <xs:sequence> 
     <xs:any processContents="lax" minOccurs="0" /> 
    </xs:sequence> 
</xs:complexType> 

我试图在一个单独的XML文件的元素声明定义的类型,但得到同样的结果。

这样一个简单的重构怎么会导致我8个小时的挣扎?我究竟做错了什么?

NB这似乎是this problem

+0

'停止工作'不是一个有用的短语。详细说明特定的错误消息或条件 – Black

回答

0

变化的逆

<xs:element name="full-account-v2" type="fullAccountV2" /> 
<xs:complexType name="fullAccountV2"> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

现在,JAXB模式编译器将FullAccountV2名称作为较早产生的假象。

也可以让nametype具有相同的值,即FullAccountV2。下面的变化也能正常工作 -

<!-- one is element and other is complexType --> 
<xs:element name="fullAccountV2" type="fullAccountV2" /> 
<xs:complexType name="fullAccountV2"> 
    <xs:sequence> 
     <xs:element name="ban" type="xs:string" /> 
     <xs:element name="status" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

以上的架构定义也会产生伪影FullAccountV2正如前面。无论我们分配给type,模式编译器都会使用它来派生工件名称。

如果您使用schemagen生成模式xsd,这也是显而易见的。例如 - 类定义如下所示

@XmlRootElement 
public class Pojo { 
    public Pojo p; 
} 

schemagen生成低于架构定义

<xs:element name="pojo" type="pojo"/> 
<xs:complexType name="pojo"> 
    <xs:sequence> 
     <xs:element name="p" type="pojo" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 

通告,nametype具有由缺省相同的值即,类名。

+0

因以下错误而失败:javax.xml.bind。MarshalException - 带有链接的异常: [com.sun.istack.internal.SAXException2:无法编组类型“com.mycompany.global.er.decoupling.binding.response.v2.FullAccountV2”作为元素,因为它缺少一个元素@XmlRootElement注释]' – mdarwin