如何在JAXB上下文的newInstance中修复nullPointerException

时间:2019-07-25 05:56:34

标签: java nullpointerexception xml-parsing jaxb

我正在尝试将XML文档解组为某些Java对象。在调用JAXBContext的newInstance方法时,我得到了NullPointerException。我正在使用JDK 1.8。

这是我的错误:

  

线程“ main”中的异常java.lang.NullPointerException在   sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)在   javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)在   javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)在   javax.xml.bind.ContextFinder.find(ContextFinder.java:390)在   javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)在   javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)在   de.bwb.TestOrgCompare.main(TestOrgCompare.java:58)

我的对象包中有一个jaxb.properties文件,内容如下: javax.xml.bind.context.factory = javax.xml.bind.JAXBContextFactory

我已经导入了2个外部jar:jaxb-api.jar和jaxb-impl-2.3.0.jar并将它们放入我项目中的lib文件夹中。

我已经尝试在jaxb.properties文件中使用org.eclipse.persistence.jaxb.JAXBContextFactory并导入org.eclipse.persistence.moxy.jar,但我遇到了同样的NullPointerException。

这是我的代码段:

            [...]
            javax.xml.bind.JAXBContext jaxbContext;
            DTORGANISATIONSYST dtorganisationSyst = null;
            try {
                //the following line is line 58: where the error appears
                jaxbContext = javax.xml.bind.JAXBContext.newInstance(DTORGANISATIONSYST.class);
                javax.xml.bind.Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                //Overloaded methods to unmarshal from different xml sources
                dtorganisationSyst = (DTORGANISATIONSYST) jaxbUnmarshaller.unmarshal( new StringReader(xmlString) );

            } catch (JAXBException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
           [...]

这是我的DTORGANISATIONSYST对象:

    //
// Diese Datei wurde mit der JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 generiert 
// Siehe <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Änderungen an dieser Datei gehen bei einer Neukompilierung des Quellschemas verloren. 
// Generiert: 2019.07.19 um 12:43:25 PM CEST 
//


package de.bwb.bant.objects;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java-Klasse für DT_ORGANISATION_SYST complex type.
 * 
 * <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
 * 
 * <pre>
 * &lt;complexType name="DT_ORGANISATION_SYST">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="HCM" type="{urn:bwb.de:ps:bant}DT_ORGANISATION_BASE" minOccurs="0"/>
 *         &lt;element name="BA" type="{urn:bwb.de:ps:bant}DT_ORGANISATION_BASE" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DT_ORGANISATION_SYST", propOrder = {
    "hcm",
    "ba"
})
@XmlRootElement(name="MT_ORGANISATION_SYST")
public class DTORGANISATIONSYST {

    @XmlElement(name = "HCM")
    protected DTORGANISATIONBASE hcm;
    @XmlElement(name = "BA")
    protected DTORGANISATIONBASE ba;

    /**
     * Ruft den Wert der hcm-Eigenschaft ab.
     * 
     * @return
     *     possible object is
     *     {@link DTORGANISATIONBASE }
     *     
     */
    public DTORGANISATIONBASE getHCM() {
        return hcm;
    }

    /**
     * Legt den Wert der hcm-Eigenschaft fest.
     * 
     * @param value
     *     allowed object is
     *     {@link DTORGANISATIONBASE }
     *     
     */
    public void setHCM(DTORGANISATIONBASE value) {
        this.hcm = value;
    }

    /**
     * Ruft den Wert der ba-Eigenschaft ab.
     * 
     * @return
     *     possible object is
     *     {@link DTORGANISATIONBASE }
     *     
     */
    public DTORGANISATIONBASE getBA() {
        return ba;
    }

    /**
     * Legt den Wert der ba-Eigenschaft fest.
     * 
     * @param value
     *     allowed object is
     *     {@link DTORGANISATIONBASE }
     *     
     */
    public void setBA(DTORGANISATIONBASE value) {
        this.ba = value;
    }

}

这是我的DTORGANISATIONBASE类:

    //
// Diese Datei wurde mit der JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802 generiert 
// Siehe <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Änderungen an dieser Datei gehen bei einer Neukompilierung des Quellschemas verloren. 
// Generiert: 2019.07.21 um 10:27:45 AM CEST 
//


package de.bwb.bant.objects;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java-Klasse für DT_ORGANISATION_BASE complex type.
 * 
 * <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
 * 
 * <pre>
 * &lt;complexType name="DT_ORGANISATION_BASE">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="SESSION_ID" type="{urn:bwb.de:ps:bant}DT_SESSION_ID_BASE" minOccurs="0"/>
 *         &lt;element name="ITEM" maxOccurs="unbounded">
 *           &lt;complexType>
 *             &lt;complexContent>
 *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 &lt;sequence>
 *                   &lt;element name="ORG_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *                   &lt;element name="ORG_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
 *                   &lt;element name="PAR_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *                   &lt;element name="PAR_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
 *                   &lt;element name="DESCR" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *                   &lt;element name="ACTIV" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *                 &lt;/sequence>
 *               &lt;/restriction>
 *             &lt;/complexContent>
 *           &lt;/complexType>
 *         &lt;/element>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DT_ORGANISATION_BASE", propOrder = {
    "sessionid",
    "item"
})
public class DTORGANISATIONBASE {

    @XmlElement(name = "SESSION_ID")
    protected String sessionid;
    @XmlElement(name = "ITEM", required = true)
    protected List<DTORGANISATIONBASE.ITEM> item;

    /**
     * Ruft den Wert der sessionid-Eigenschaft ab.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getSESSIONID() {
        return sessionid;
    }

    /**
     * Legt den Wert der sessionid-Eigenschaft fest.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setSESSIONID(String value) {
        this.sessionid = value;
    }

    /**
     * Gets the value of the item property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the item property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getITEM().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link DTORGANISATIONBASE.ITEM }
     * 
     * 
     */
    public List<DTORGANISATIONBASE.ITEM> getITEM() {
        if (item == null) {
            item = new ArrayList<DTORGANISATIONBASE.ITEM>();
        }
        return this.item;
    }


    /**
     * <p>Java-Klasse für anonymous complex type.
     * 
     * <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
     * 
     * <pre>
     * &lt;complexType>
     *   &lt;complexContent>
     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       &lt;sequence>
     *         &lt;element name="ORG_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
     *         &lt;element name="ORG_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
     *         &lt;element name="PAR_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
     *         &lt;element name="PAR_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
     *         &lt;element name="DESCR" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
     *         &lt;element name="ACTIV" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
     *       &lt;/sequence>
     *     &lt;/restriction>
     *   &lt;/complexContent>
     * &lt;/complexType>
     * </pre>
     * 
     * 
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "orghcmid",
        "orgbaid",
        "parhcmid",
        "parbaid",
        "descr",
        "activ"
    })
    public static class ITEM {

        @XmlElement(name = "ORG_HCM_ID")
        protected String orghcmid;
        @XmlElement(name = "ORG_BA_ID")
        protected BigInteger orgbaid;
        @XmlElement(name = "PAR_HCM_ID")
        protected String parhcmid;
        @XmlElement(name = "PAR_BA_ID")
        protected BigInteger parbaid;
        @XmlElement(name = "DESCR")
        protected String descr;
        @XmlElement(name = "ACTIV")
        protected String activ;

        /**
         * Ruft den Wert der orghcmid-Eigenschaft ab.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public String getORGHCMID() {
            return orghcmid;
        }

        /**
         * Legt den Wert der orghcmid-Eigenschaft fest.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setORGHCMID(String value) {
            this.orghcmid = value;
        }

        /**
         * Ruft den Wert der orgbaid-Eigenschaft ab.
         * 
         * @return
         *     possible object is
         *     {@link BigInteger }
         *     
         */
        public BigInteger getORGBAID() {
            return orgbaid;
        }

        /**
         * Legt den Wert der orgbaid-Eigenschaft fest.
         * 
         * @param value
         *     allowed object is
         *     {@link BigInteger }
         *     
         */
        public void setORGBAID(BigInteger value) {
            this.orgbaid = value;
        }

        /**
         * Ruft den Wert der parhcmid-Eigenschaft ab.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public String getPARHCMID() {
            return parhcmid;
        }

        /**
         * Legt den Wert der parhcmid-Eigenschaft fest.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setPARHCMID(String value) {
            this.parhcmid = value;
        }

        /**
         * Ruft den Wert der parbaid-Eigenschaft ab.
         * 
         * @return
         *     possible object is
         *     {@link BigInteger }
         *     
         */
        public BigInteger getPARBAID() {
            return parbaid;
        }

        /**
         * Legt den Wert der parbaid-Eigenschaft fest.
         * 
         * @param value
         *     allowed object is
         *     {@link BigInteger }
         *     
         */
        public void setPARBAID(BigInteger value) {
            this.parbaid = value;
        }

        /**
         * Ruft den Wert der descr-Eigenschaft ab.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public String getDESCR() {
            return descr;
        }

        /**
         * Legt den Wert der descr-Eigenschaft fest.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setDESCR(String value) {
            this.descr = value;
        }

        /**
         * Ruft den Wert der activ-Eigenschaft ab.
         * 
         * @return
         *     possible object is
         *     {@link String }
         *     
         */
        public String getACTIV() {
            return activ;
        }

        /**
         * Legt den Wert der activ-Eigenschaft fest.
         * 
         * @param value
         *     allowed object is
         *     {@link String }
         *     
         */
        public void setACTIV(String value) {
            this.activ = value;
        }

    }

}

我对Jaxb和编组/解组XML文档没有太多经验,希望您能给我一些提示。

一个通知:如果删除jaxb.properties文件,代码将正常工作。但是我需要将代码(作为jar存档)导出到另一个系统,并且该系统需要jaxb.properties文件来运行我的类。因此,它必须与此文件一起使用。

因此,在解决了此NullPointerException之后,其余代码应该没问题。

非常感谢您的帮助!

恩里科问候

1 个答案:

答案 0 :(得分:0)

我没有设法复制NullPointerException,但是我注意到了两件事:

  1. jaxb.properties文件必须包含对javax.xml.bind.JAXBContextFactory的实现的引用,它只是一个接口。

    例如eclipselink实现:

   javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

  1. 在Java 8中,JAXB仍然是标准环境的一部分,但是它的版本略旧(2.2.8)。但是,即使在一个新项目中,在maven依赖项中添加其他新的jaxb版本时,我也没有NPE问题。