2012-07-12 44 views
4

對象模型的元素類型爲String我可以得到莫西將字符串轉換爲布爾產生JSON

public class LifeSpan { 

protected String begin; 
protected String end; 
@XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
protected String ended; 
.... 

的結束,但它實際上只有永遠一個布爾值,(我不知道的意義XmlJavaTypeAdapter註釋)

當作爲XML輸出給

<life-span><begin>1999-04</begin><ended>true</ended></life-span> 

因此,如果定義爲布爾或字符串

其實並不重要

但JSON輸出

"life-span" : { 
     "begin" : "1999-04", 
     "ended" : "true" 
     }, 

,當我需要它是

"life-span" : { 
     "begin" : "1999-04", 
     "ended" : true 
     }, 

我真的不能改變對象模型,所以以爲我也許能映射到oxml.xml正確的類型文件,並試圖

<java-type name="LifeSpan"> 
      <java-attributes> 
       <xml-element java-attribute="ended" type="boolean"/> 
      </java-attributes> 
     </java-type> 

但它沒有那樣。

回答

3

下面是如何支持這個用例EclipseLink JAXB (MOXy)

BooleanStringAdapter

XmlAdapter讓你封一個類型的對象作爲另一種類型(見http://blog.bdoughan.com/2010/07/xmladapter-jaxbs-secret-weapon.html)。在這個例子中,我們想將String的值作爲Boolean之一。

package forum11451880; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class BooleanStringAdapter extends XmlAdapter<Boolean, String> { 

    @Override 
    public String unmarshal(Boolean v) throws Exception { 
     return v.toString(); 
    } 

    @Override 
    public Boolean marshal(String v) throws Exception { 
     return Boolean.valueOf(v); 
    } 

} 

oxm.xml

我們可以利用莫西的外部映射文件,以增加通過註釋提供的元數據中我們XmlAadapter掛鉤(見http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html)。

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="forum11451880"> 
    <java-types> 
     <java-type name="LifeSpan"> 
      <java-attributes> 
       <xml-element java-attribute="end"> 
        <xml-java-type-adapter value="forum11451880.BooleanStringAdapter"/> 
       </xml-element> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

壽命

下面是你的域模型與String類型的end財產。你需要

package forum11451880; 

import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class LifeSpan { 

    protected String begin; 

    protected String end; 

    @XmlJavaTypeAdapter(CollapsedStringAdapter.class) 
    protected String ended; 

} 

jaxb.properties

要指定莫西爲您的JAXB提供者包括與跟隨着進入所謂jaxb.properties文件(見http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):

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

演示

dem以下的演示代碼介紹如何利用外部映射文檔。

package forum11451880; 

import java.util.*; 
import javax.xml.bind.*; 
import org.eclipse.persistence.jaxb.JAXBContextProperties; 
import org.eclipse.persistence.jaxb.MarshallerProperties; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     Map<String, Object> properties = new HashMap<String, Object>(1); 
     properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "forum11451880/oxm.xml"); 
     JAXBContext jc = JAXBContext.newInstance(new Class[] {LifeSpan.class}, properties); 

     LifeSpan lifeSpan = new LifeSpan(); 
     lifeSpan.begin = "1999-04"; 
     lifeSpan.end = "true"; 

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

     marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 
     marshaller.marshal(lifeSpan, System.out); 
    } 

} 

輸出

下面是從運行的例子中的輸出。正如你可以看到出現在true值不帶引號:

<?xml version="1.0" encoding="UTF-8"?> 
<lifeSpan> 
    <begin>1999-04</begin> 
    <end>true</end> 
</lifeSpan> 
{ 
    "lifeSpan" : { 
     "begin" : "1999-04", 
     "end" : true 
    } 
} 
+1

三江源的作品(實際上是屬性結束,雖然有可能結束attribut EAS好,我沒有顯示),再次感謝你的幫助上這個。 – 2012-07-12 18:36:05