2012-02-21 70 views
2

我的問題似乎很簡單,但我無法找到任何完全像它在stackoverflow上的東西。jaxb marshall布爾整數(0,1)問題

我使用JAXB的馬歇爾/解組此對象:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "") 
@XmlRootElement(name = "root") 
public class MyJaxbObject implements Serializable 
{ 

    @XmlElement(name = "DELETE") 
    @XmlJavaTypeAdapter(BooleanIntAdapter.class) 
    private Boolean delete; 

    @XmlElement(name = "message") 
    private String message; 

    constructors.. getters... setters... 
} 

我BooleanAdapter是一個簡單的XmlAdapter<Integer, Boolean>,輪流真/假以1/0和背部。

解組工作,但編組沒有。它總是yeilds這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <DELETE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.or/2001/XMLSchema" xsi:type="xs:boolean">true</DELETE> 
    <message>***DONE***</message> 
</root> 

當我的XML元素的配置更改爲@XmlElement(name = "DELETE",type = Boolean.class)解組布爾的失敗和編組產量如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <DELETE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:int">1</DELETE> 
    <message>***DONE***</message> 
</root> 

我把簡單的打印消息中的元帥/解組方法xml適配器並嘗試對這種對象進行編組/解組。

我看到沒有類型聲明unmarshal方法被調用,但元帥不是。 對於類型聲明,只調用元帥。

幫助?? 如何編組/解組布爾到/從{1,0},並可能擺脫編組xml中的xsi:類型?

編輯 - 這是我用於測試編組/解組的代碼:

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
    JAXBContext context = javax.xml.bind.JAXBContext.newInstance("my.package.classes"); 
    Unmarshaller unmarshal = context.createUnmarshaller(); 
    Marshaller marshal = context.createMarshaller(); 
    marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

    String str = "<root><DELETE>1</DELETE><message>***DONE***</message></root>"; 
    DocumentBuilder builder = docBuilderFactory.newDocumentBuilder(); 
    Document d = null; 
    d = builder.parse(new InputSource(new StringReader(str))); 

    MyJaxbObject myJaxUnmarsh = unmarshal.unmarshal(d.getFirstChild(), MyJaxbObject.class).getValue(); 
    System.out.println(myJaxUnmarsh.getMessage() + " , " + myJaxUnmarsh.getDelete()); 

    MyJaxbObject myJax = new MyJaxbObject(); 
    myJax.setDelete(true); 
    myJax.setMessage("***DONE***"); 
    marshal.marshal(myJax, System.out); 
+0

更新:我開了一個新的項目來測試這個問題,它完美地工作。所以它必定是我的項目中的一些依賴項,它會覆蓋JAXB行爲中的某些內容並導致此問題。我正在使用maven並可以提供pom.xml。但在此之前,有沒有人有任何知識庫可以干擾jaxb操作? – samz 2012-02-22 07:57:59

+0

找到CULPRIT - 它的cxf lib:cxf-rt-core。去檢查這個和jaxb是否存在已知的問題。將在我找到修復程序時發佈更新。 – samz 2012-02-22 08:08:18

回答

0

發現了問題:

CXF POM使得項目使用JAXB-implement執行版本2.1.0。 沒有CXF,項目使用的JDK默認值是2.1.10。 看到: http://jaxb.java.net/guide/Which_JAXB_RI_is_included_in_which_JDK_.html

我添加了依賴管理下,下面來解決這個問題

<dependency> 
    <groupId>com.sun.xml.bind</groupId> 
    <artifactId>jaxb-impl</artifactId> 
    <version>2.2.5</version> 
    <type>jar</type> 
    <scope>compile</scope> 
</dependency> 
1

用下面的實施BooleanIntAdapter

BooleanIntAdapter

package forum9380680; 

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

public class BooleanIntAdapter extends XmlAdapter<Integer, Boolean> { 

    @Override 
    public Boolean unmarshal(Integer v) throws Exception { 
     return v.equals(1); 
    } 

    @Override 
    public Integer marshal(Boolean v) throws Exception { 
     if(v) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 

} 

輸出

我得到以下輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <DELETE>1</DELETE> 
    <message>***DONE***</message> 
</root> 

下面是我使用的代碼的其餘部分:

演示

package forum9380680; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

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

     MyJaxbObject object = new MyJaxbObject(); 
     object.setDelete(true); 
     object.setMessage("***DONE***"); 

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

} 

MyJaxbObject

package forum9380680; 

import java.io.Serializable; 

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

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "") 
@XmlRootElement(name = "root") 
public class MyJaxbObject implements Serializable 
{ 

    @XmlElement(name = "DELETE") 
    @XmlJavaTypeAdapter(BooleanIntAdapter.class) 
    private Boolean delete; 

    @XmlElement(name = "message") 
    private String message; 

    public Boolean getDelete() { 
     return delete; 
    } 

    public void setDelete(Boolean delete) { 
     this.delete = delete; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

} 
+0

我的實現幾乎完全一樣,唯一的區別是空檢查,它不適用於我... – samz 2012-02-21 17:32:05

+0

@samz - 您使用的是哪個版本的JDK/JRE?我正在使用JDK 1.6.0_29。我使用JAXB RI和EclipseLink JAXB(MOXy)獲得了該輸出。 – 2012-02-21 17:36:38

+0

1.6.0_17,jaxb自從改變了? =/ – samz 2012-02-21 17:40:11