2012-12-12 26 views
4

以下是我使用的使用在WebLogic 10.3.2版莫西JAXB轉換創建子類的類。我正在使用EclipseLink 2.4.1 MOXy來生成XML。我無法在下面的代碼中生成類型屬性。讓我知道我在這裏做錯了什麼。@ XmlDiscriminatorNode/@ XmlDescriminatorValue不工作WebLogic Server上

我使用的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 { 
} 

REST的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不存在。

回答

1

有可能導致您的問題的幾項產品。

BaseEntity

缺省情況下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是莫西擴展你需要確保你指定莫西爲您的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> 

更多信息

+1

非常感謝。我錯過了上面的jaxb.properties。 – user1896301

+0

在上面的例子中,我用@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})生成XML和JSON的方法相同。請你告訴我如何配置MOXY JSON來使用。 – user1896301

+0

@ user1896301 - 以下是將MOXY配置爲您的JSON提供者的最佳方式:http://blog.bdoughan.com/2012/05/moxy-as-your-jax-rs-json-provider.html –