【问题标题】:@XmlDiscriminatorNode/@XmlDescriminatorValue not working on WebLogic Server@XmlDiscriminatorNode/@XmlDecriminatorValue 在 WebLogic Server 上不起作用
【发布时间】:2012-11-29 15:37:52
【问题描述】:

以下是我在 WebLogic 10.3.2 版本上使用 MOXy JAXB 转换创建子类的类。我正在使用 EclipseLink 2.4.1 MOXy 来生成 XML。我无法在以下代码中生成类型属性。如果我在这里做错了什么,请告诉我。

我使用的是 EclipseLink MOXy 2.4.1 和 WebLogic 10.3.2 并且 MOXy 2.4.1 是在 WebLogic 中配置的

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlDiscriminatorNode("@type")
public abstract class BaseEntity {

    private String firstName;
    private String lastName;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

}

子类

package forum13831189;

import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorValue;

@XmlDiscriminatorValue("xyz")
public class XyzEntity extends BaseEntity {

    public XyzEntity() {
        super();
    }

}

另一个子类

import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorValue;

@XmlDiscriminatorValue("Abc")
public class AbcEntity extends BaseEntity {
}

RESTful Web 服务类:

@GET
@Path("/xyz")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Representation getAccount() throws CPAException {
    Representation rep = new Representation();
    BaseEntity entity = new XyzEntity();
    entity.setFirstName("first-name");
    entity.setLastName("last-name");
    rep.setEntity(entity);
    return rep;
}

@XmlRootElement
static class Representation {
    private BaseEntity entity;

    public BaseEntity getEntity() {
        return entity;
    }

    public void setEntity(BaseEntity entity) {
        this.entity = entity;
    }
}

上面正在生成以下 XML。

<representation>
     <firstName>first-name</firstName>
      <lastName>last-name</lastName>
 </representation>

上面没有生成属性类型。


非常感谢。是的,我错过了上面的 jaxb.properties。 另外,是的,当我使用 PUT 或 POST 时,当反序列化 XML 时,如果不存在 @XmlSeeAlso,它就无法创建子类。

【问题讨论】:

    标签: jaxb eclipselink weblogic-10.x moxy


    【解决方案1】:

    有几个项目可能会给您带来问题。

    基础实体

    默认情况下,JAX-RS 实现会在服务方法的返回类型或参数上创建JAXBContext,在本例中为Represenatation。在处理域模型时,JAXB impl 还将引入引用类型,例如 BaseEntity。它不能自动拉入子类,所以我们可以使用@XmlSeeAlso 注解来引用它们。

    import javax.xml.bind.annotation.*;
    import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;
    
    @XmlAccessorType(XmlAccessType.PROPERTY)
    @XmlDiscriminatorNode("@type")
    @XmlSeeAlso({AbcEntity.class, XyzEntity.class})
    public abstract class BaseEntity {
    
        private String firstName;
        private String lastName;
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
    }
    

    jaxb.properties

    此外,由于 @XmlDescriminatorNode/@XmlDescriminatorValue 是 MOXy 扩展,您需要确保将 MOXy 指定为您的 JAXB 提供程序。这是通过在与您的域模型相同的包中添加一个名为 jaxb.properties 的文件来完成的。

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    

    演示

    下面是一个独立的示例,它模仿了您的 RESTful 服务的功能。

    import javax.xml.bind.*;
    import javax.xml.bind.annotation.XmlRootElement;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance(Representation.class);
    
            Representation rep = new Representation();
            BaseEntity entity = new XyzEntity();
            entity.setFirstName("first-name");
            entity.setLastName("last-name");
            rep.setEntity(entity);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(rep, System.out);
        }
    
        @XmlRootElement
        static class Representation {
            private BaseEntity entity;
    
            public BaseEntity getEntity() {
                return entity;
            }
    
            public void setEntity(BaseEntity entity) {
                this.entity = entity;
            }
        }
    
    }
    

    输出

    下面是运行演示代码的输出。看到type 属性现在存在。

    <?xml version="1.0" encoding="UTF-8"?>
    <representation>
       <entity type="xyz">
          <firstName>first-name</firstName>
          <lastName>last-name</lastName>
       </entity>
    </representation>
    

    更多信息

    【讨论】:

    • 非常感谢。我错过了上面的 jaxb.properties。
    • 在上面的示例中,我使用与 @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 相同的方法来生成 XML 和 JSON 是否可以让我知道如何将 MOXY JSON 配置为用过。
    • @user1896301 - 以下是将 MOXy 配置为 JSON 提供程序的最佳方式:blog.bdoughan.com/2012/05/…
    猜你喜欢
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多