我正在尝试将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>
* <complexType name="DT_ORGANISATION_SYST">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="HCM" type="{urn:bwb.de:ps:bant}DT_ORGANISATION_BASE" minOccurs="0"/>
* <element name="BA" type="{urn:bwb.de:ps:bant}DT_ORGANISATION_BASE" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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>
* <complexType name="DT_ORGANISATION_BASE">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="SESSION_ID" type="{urn:bwb.de:ps:bant}DT_SESSION_ID_BASE" minOccurs="0"/>
* <element name="ITEM" maxOccurs="unbounded">
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="ORG_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="ORG_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
* <element name="PAR_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="PAR_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
* <element name="DESCR" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="ACTIV" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </element>
* </sequence>
* </restriction>
* </complexContent>
* </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>
* <complexType>
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="ORG_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="ORG_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
* <element name="PAR_HCM_ID" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="PAR_BA_ID" type="{http://www.w3.org/2001/XMLSchema}integer" minOccurs="0"/>
* <element name="DESCR" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="ACTIV" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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之后,其余代码应该没问题。
非常感谢您的帮助!
恩里科问候
答案 0 :(得分:0)
我没有设法复制NullPointerException
,但是我注意到了两件事:
jaxb.properties
文件必须包含对javax.xml.bind.JAXBContextFactory
的实现的引用,它只是一个接口。
例如eclipselink实现:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
JAXB
仍然是标准环境的一部分,但是它的版本略旧(2.2.8)。但是,即使在一个新项目中,在maven依赖项中添加其他新的jaxb版本时,我也没有NPE问题。