Jaxb 不使用 XmlRootElement 集编组 xsi:type



我正在尝试从球衣 2 服务+ jaxb RI 基于此 xsd 的 concrecte 类中编组一个 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,并要求我的球衣服务简单地返回一个 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="TExpressionWithContent":

<?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,因为 jersey 找不到我的类的任何 MessageBodyWriter,因此不会使用 jaxb 映射 TExpresionWithContent。任何帮助将不胜感激

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

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

最新更新