1

我正在一个简单的 java 类上尝试 Marshaller 和 unMarshaller 的测试代码。

我创建我的对象并设置它的 ID。遇到的问题是在将其解组回java对象后,ID变量不一样......

我的问题是:

  1. 为什么这不起作用并且两个对象的 ID 不同?
  2. 我的 java 类必须为所有变量设置一个方法?还是 Marshaller 使用不同的方式来更新类变量?

这是我的代码片段:

package test;


import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
import org.junit.Test;

public class test {

    @Test
    public void marshallingTest() throws JAXBException{

        // Create a JAXB context passing in the class of the object we want to marshal/unmarshal
        final JAXBContext context = JAXBContext.newInstance(JavaObject.class);

        // Create the marshaller
        final Marshaller marshaller = context.createMarshaller();

        // Create a stringWriter to hold the XML
        final StringWriter stringWriter = new StringWriter();

        // Create my java object
        final JavaObject javaObject = new JavaObject();

        // set the objects ID
        javaObject.setId(90210);

        // Marshal the javaObject and write the XML to the stringWriter
        marshaller.marshal(javaObject, stringWriter);

        // Print out the contents of the stringWriter
        System.out.println("First object :");
        System.out.println(javaObject.toString());

        // Create the unmarshaller
        final Unmarshaller unmarshaller = context.createUnmarshaller();

        // Unmarshal the XML 
        final JavaObject javaObject2 = (JavaObject) unmarshaller.unmarshal(new StringReader(stringWriter.toString()));

        //print the new object
        System.out.println("Second object after unmarshaller :");
        System.out.println(javaObject2.toString());
    }

    @XmlRootElement
    private static class JavaObject {
        private int id;

        public JavaObject() {
        }

        private int getId() {
            return id;
        }
        private void setId(int id) {
            this.id = id;
        }
        @Override
        public String toString() {
            return "id = "+id;
        }
    }
}

这是输出:

First object :
id = 90210
Second object after unmarshaller :
id = 0
4

4 回答 4

3

默认情况下,JAXB (JSR-222) 实现会将所有公共字段和属性视为已映射。您的访问器(get/set)方法应该是public,您目前将它们作为private. 或者你可以@XmlAccessorType(XmlAccessType.FIELD)在你的类上指定,这告诉 JAXB 映射可能是私有的字段。

了解更多信息

于 2013-03-19T12:05:54.580 回答
0

试试这个:

@XmlElement    
private void setId(int id) {
        this.id = id;
    }
于 2013-03-19T11:23:57.423 回答
0
  @XmlRootElement 
    private static class JavaObject {
         @XmlElement 
        private int id;
于 2013-03-19T11:26:48.543 回答
0

您需要指定哪些字段是 xml 结构的一部分。

您可以@XmlElement按照先前答案的建议添加或使用@XmlACcessorType注释:

  @XmlRootElement
  @XmlAccessorType(XmlAccessType.FIELD)
  private static class JavaObject {
  }

默认情况下,这将访问您班级的所有字段

于 2013-03-19T11:38:14.047 回答