2012-12-14 49 views
1

我在定製我的JAXB Marshaller時遇到了麻煩。我有我的編組代碼:使用JAXB創建spring bean和必要的屬性

public void marshaller(AddressMap addMap, File file) { 
    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(AddressMap.class); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     jaxbMarshaller.marshal(addMap, System.out); 

    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } 
} 

輸出看起來是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ObjectMap> 
<Prop> Indiana</Prop> 
<Prop1>39.0</Prop1> 
<Prop2>-85.0</Prop2> 
<Prop3> United States</Prop3> 
<Prop4> Hueseman Rd</Prop4> 
<Prop5> 8540-8704</Prop5> 
<Prop6> 47001</Prop6> 
</ObjectMap> 

相反,我需要它看起來像這樣:

<bean class="classname"> 
    <property name="PropName" value="object value" /> 
    <property name="PropName1" value="object value" /> 
    <property name="PropName2" value="object value" /> 
    <property name="PropName3" value="object value" /> 
    <property name="PropName4" value="object value" /> 
    <property name="PropName5" value="object value" /> 
    <property name="PropName6" value="object value" /> 
</bean> 
+0

添加您的'AddressMap'類的定義。 – Perception

+0

你是什麼意思?添加命名空間?還是註釋? – shaunw

+2

JAXB將帶註釋的POJO綁定到XML。在這種情況下,POJO是你的'AddressMap'類。我們需要了解您如何定義它以便能夠爲您提供幫助。因此,請在您的問題中包含代碼的相關部分。 – Perception

回答

2

注:EclipseLink JAXB (MOXy)負責人和JAXB (JSR-222)專家組的成員。

您可以使用MOXy的@XmlDesciminatorNode@XmlPath擴展來映射此用例。下面是一個基於我假設你的對象模型看起來像的例子。

ObjectMap的

@XmlDescriminatorNode註解允許你指定你想要一個特定的XML屬性作爲繼承指標。

package forum13884782; 

import javax.xml.bind.annotation.XmlRootElement; 

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

@XmlRootElement(name="bean") 
@XmlDiscriminatorNode("@class") 
public class ObjectMap { 

} 

AddressMap

@XmlDescriminatorValue註解用於指定涉及的實例類的descriminator節點上的值。在本課中,我們還使用@XmlPath註釋來指示我們希望基於其name屬性的值映射哪個元素。

package forum13884782; 

import javax.xml.bind.annotation.*; 

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

@XmlRootElement(name="bean") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlDiscriminatorValue("AddressMap") 
public class AddressMap extends ObjectMap { 

    @XmlPath("property[@name='PropName']/@value") 
    String prop; 

    @XmlPath("property[@name='PropName1']/@value") 
    String prop1; 

    @XmlPath("property[@name='PropName2']/@value") 
    String prop2; 

    @XmlPath("property[@name='PropName3']/@value") 
    String prop3; 

    @XmlPath("property[@name='PropName4']/@value") 
    String prop4; 

    @XmlPath("property[@name='PropName5']/@value") 
    String prop5; 

    @XmlPath("property[@name='PropName6']/@value") 
    String prop6; 

} 

jaxb.properties

要指定莫西爲您的JAXB提供你需要包括一個名爲在同一個包jaxb.properties與下面進入你的領域模型文件。

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

演示

下面的演示代碼將XML消息轉換成的AddressMap一個實例,然後回XML。

package forum13884782; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(AddressMap.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum13884782/input.xml"); 
     AddressMap addressMap = (AddressMap) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(addressMap, System.out); 
    } 

} 

input.xml中/輸出

<bean class="AddressMap"> 
    <property name="PropName" value="Indiana" /> 
    <property name="PropName1" value="39.0" /> 
    <property name="PropName2" value="-85.0" /> 
    <property name="PropName3" value="United States" /> 
    <property name="PropName4" value="Hueseman Rd" /> 
    <property name="PropName5" value="8540-8704" /> 
    <property name="PropName6" value="47001" /> 
</bean> 

更多信息

+1

非常感謝!這非常有幫助。 – shaunw