2012-02-21 67 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