【问题标题】:Exception in thread "main" java.lang.NullPointerException when using Jaxb unmarshal/marshal使用 Jaxb 解组/编组时线程“主”java.lang.NullPointerException 中的异常
【发布时间】:2014-04-01 10:02:22
【问题描述】:

我正在使用 JAXB 将给定的输入 Xml 文件解组为 Java 对象 然后将其整理回 Xml 字符串。 我的 Xml 文件如下所示:

<bpmn2:definitions xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" id="_Definitions_1">
    <bpmn2:process id="_500441" name="process">
    </bpmn2:process>
</bpmn2:definitions>

Definitions.class:

@XmlRootElement(namespace = "http://www.omg.org/spec/BPMN/20100524/MODEL")
public class Definitions {
    @XmlAttribute
    private String id;

    @XmlElement(name = "bpmn2:process")
    private Process process;

    @XmlElement(name = "bpmndi:BPMNDiagram")
    private Diagram diagram;

    public Definitions() {
    }
    public Definitions(String id, Process process, Diagram diagram) {
        this.id = id;
        this.process = process;
        this.diagram = diagram;
    }
    public Process getProcess() {
        return process;
    }
    public Diagram getDiagram() {
        return diagram;
    }
    public String getId() {
        return id;
    }
}

Process.class:

@XmlAccessorType(XmlAccessType.FIELD)
public class Process {
    @XmlAttribute
    private String id;
    public Process() {
    }
    public Process(String id) {
        this.id = id;
    }
    public String getId() {
        return id;
    }
}

Model.class:

public class Model {
    @XmlElement
    private Process process;
    public Model() {
    }
    public Model(String processId, Process p) {
        this.id = processId;
        this.process = p;
    }
}

主要方法:

public static void main(String[] args) throws IOException, JSONException, JAXBException {
        BpmnToJsonImport bj = new BpmnToJsonImport();
        InputStream is = BpmnToJsonImport.class.getResourceAsStream("myXml.txt");
        String Str = IOUtils.toString(is);
        StringReader sr = new StringReader(Str);
        JAXBContext context = JAXBContext.newInstance(Definitions.class, Model.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();

        Definitions d = (Definitions) unmarshaller.unmarshal(sr);
        Model model = new Model(d.getProcess().getId(), d.getProcess());

        StringWriter sw = new StringWriter();

        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        marshaller.marshal(model, sw);
        String str = sw.toString();
        System.out.println(str);

    }

当它尝试使用 d.getProcess.getId 检索进程 ID 时,我得到了 java.lang.NullPointerException

【问题讨论】:

  • 尝试为您的 XML 文件使用完全限定的路径。例如:C:\MyFolder\myXml.txt 可能是找不到 myXml.txt。如果找到了,可能是你的“Process.class”没有“name”字段?
  • 问题不在于文件,因为当我这样做时:System.out.println(d.getId()) 它给了我 bpmn2:definitions 的 id。我不需要名称字段
  • 这里有很多问题。 Model.java 无法编译,而且您还没有提供 Diagram 类。我能够通过从 definitions.class 中删除“bpmn2”命名空间限定符来克服您的错误,因此我会说您在某处有注释错误。

标签: java xml jaxb marshalling unmarshalling


【解决方案1】:

您正在错误地映射命名空间限定。您不得在元素名称中包含前缀。

@XmlElement(name = "BPMNDiagram")
private Diagram diagram;

要映射命名空间限定,您可以使用包级别的@XmlSchema 注释。

package-info.java

@XmlSchema( 
    namespace =  "http://www.omg.org/spec/BPMN/20100524/MODEL",
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

更多信息

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多