Исключение в потоке «main» java.lang.NullPointerException при использовании Jaxb unmarshal / marshal

1

Я использую JAXB для развязывания заданного входного Xml файла в объект Java и затем перенаправить его обратно в Xml String. Мой 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, я получаю java.lang.NullPointerException

  • 0
    Попробуйте использовать полный путь к вашему XML-файлу. Например: C: \ MyFolder \ myXml.txt Возможно, myXml.txt не найден. Если он найден, возможно, ваш «Process.class» не имеет поля «name»?
  • 0
    проблема не с файлом, потому что когда я делаю: System.out.println (d.getId ()), он дает мне идентификатор bpmn2: определения. Мне не нужно поле имени
Показать ещё 1 комментарий
Теги:
jaxb
marshalling
unmarshalling

1 ответ

1
Лучший ответ

Вы неправильно указываете квалификацию пространства имен. Вы не должны включать префикс в имя элемента.

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

Чтобы сопоставить квалификацию пространства имен, вы можете использовать аннотацию @XmlSchema уровне @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;

Чтобы получить больше информации

  • 0
    Я решил проблему для процесса, определяющего пространство имен, как вы предложили, но я получаю ту же ошибку для BPMNDiagram, для которой мне нужно использовать другое пространство имен " omg.org/spec/BPMN/20100524/DI ". Я попробовал этот способ @XmlSchema (пространство имен = " omg.org/spec/BPMN/20100524/MODEL ", elementFormDefault = XmlNsForm.QUALIFIED, XMLNS = {@ javax.xml.bind.annotation.XmlNs (префикс = "bpmn2", NamespaceURI = " omg.org/spec/BPMN/20100524/MODEL" ), @ javax.xml.bind.annotation.XmlNs (prefix = "bpmndi", namespaceURI = " omg.org/spec/BPMN/20100524/DI" )} ) но это не сработало

Ещё вопросы

Сообщество Overcoder
Наверх
Меню