Jaxb没有设置xmlRootElement的xsi:type

时间:2017-05-11 09:45:11

标签: jersey-2.0 xsitype

我试图从基于xsd的球衣2服务+ jaxb RI implmentation编组一个concrecte类:

<xs:schema xmlns="http://namespace"
       targetNamespace="http://namespace"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
       elementFormDefault="qualified"
       jaxb:version="2.0"
       version="1.0">
<xs:element name="Expression" type="ATExpression" />

<xs:element name="Expressions"  type="ATExpressions" />

<xs:complexType name="ATExpressions">
    <xs:sequence>
        <xs:element type="ATExpression" name="Expression" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="ATExpression" abstract="true"/>
<xs:complexType name="TExpressionWithRef">
    <xs:complexContent>
        <xs:extension base="ATExpression">
            <xs:attribute name="ref" type="xs:string" use="required"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="TExpressionWithContent">
    <xs:complexContent>
        <xs:extension base="ATExpression">
            <xs:sequence>
                <xs:element name="gufid" type="xs:string"/>
                <xs:element name="code" type="xs:string"/>
                <xs:element name="expression" type="xs:string"/>
                <xs:element name="expressionType" type="xs:string"/>
                <xs:element name="description" type="xs:string" minOccurs="0"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

我在TExpressionWithContent上添加了一个XmlRootElement,并要求我的jersey服务只返回一个TExpressionWithContent:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TExpressionWithContent", propOrder = {
"gufid",
"code",
"expression",
"expressionType",
"description"
})
@XmlRootElement(name = "Expression")
public class TExpressionWithContent
extends ATExpression
{

@XmlElement(required = true)
protected String gufid;
@XmlElement(required = true)
protected String code;
@XmlElement(required = true)
protected String expression;
@XmlElement(required = true)
protected String expressionType;
protected String description;

/**
 * Obtient la valeur de la propriété gufid.
 * 
 * @return
 *     possible object is
 *     {@link String }
 *     
 */
public String getGufid() {
    return gufid;
}

/**
 * Définit la valeur de la propriété gufid.
 * 
 * @param value
 *     allowed object is
 *     {@link String }
 *     
 */
public void setGufid(String value) {
    this.gufid = value;
}

/**
 * Obtient la valeur de la propriété code.
 * 
 * @return
 *     possible object is
 *     {@link String }
 *     
 */
public String getCode() {
    return code;
}

/**
 * Définit la valeur de la propriété code.
 * 
 * @param value
 *     allowed object is
 *     {@link String }
 *     
 */
public void setCode(String value) {
    this.code = value;
}

/**
 * Obtient la valeur de la propriété expression.
 * 
 * @return
 *     possible object is
 *     {@link String }
 *     
 */
public String getExpression() {
    return expression;
}

/**
 * Définit la valeur de la propriété expression.
 * 
 * @param value
 *     allowed object is
 *     {@link String }
 *     
 */
public void setExpression(String value) {
    this.expression = value;
}

/**
 * Obtient la valeur de la propriété expressionType.
 * 
 * @return
 *     possible object is
 *     {@link String }
 *     
 */
public String getExpressionType() {
    return expressionType;
}

/**
 * Définit la valeur de la propriété expressionType.
 * 
 * @param value
 *     allowed object is
 *     {@link String }
 *     
 */
public void setExpressionType(String value) {
    this.expressionType = value;
}

/**
 * Obtient la valeur de la propriété description.
 * 
 * @return
 *     possible object is
 *     {@link String }
 *     
 */
public String getDescription() {
    return description;
}

/**
 * Définit la valeur de la propriété description.
 * 
 * @param value
 *     allowed object is
 *     {@link String }
 *     
 */
public void setDescription(String value) {
    this.description = value;
}

}

然而,通过这样做,我的xml缺少xsi:type =&#34; TExpressionWithContent&#34;在Expression根元素上:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Expression xmlns="http://namespace">
 <gufid>327EDAB5-8B95-41B4-B583-5B58914BED59</gufid>
 <code>Gendddre5448</code>
 <expression>Particulier42.genre = lookup('genre', Particulier.genre) </expression>
<expressionType>TRANSFORMATION</expressionType>
<description>descriptSDFDFDFDion2</description>
</Expression>

我无法移除XmlRootElement,因为我的班级找不到任何MessageBodyWriter,因此不会将TExpresionWithContent映射到jaxb。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

发现我的错误。我必须将具体类包装到抽象类中。

ObjectFactory objectFactory=new ObjectFactory();    
TExpressionWithContent tExpression = expressionService.getExpression(gufid);
return objectFactory.createExpression(tExpression)