java - XML 解码期间的 NullPointerException

标签 java jaxb

我从在同一项目中为我工作的相同 xml 开发了以下 xml。但是当我试图解码这些时,我得到了 NullPointerException。

我将我所有的 java 类与我正在解码的 xml 放在一起。

请帮忙

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dbSchema>
    <table tableName="table1">
        <column columnName="column1">
            <dataType>varchar</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
            <isPrimaryKey>true</isPrimaryKey>
        </column>

        <column columnName="column2">
            <dataType>timestamp</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column3">
            <dataType>varchar</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column4">
            <dataType>decimal</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column5">
            <dataType>integer</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column6">
            <dataType>varchar2</dataType>
            <isNullAllowed>false</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column7">
            <dataType>date</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column8">
            <dataType>decimal</dataType>
            <isNullAllowed>false</isNullAllowed>
            <defaultValue></defaultValue>
        </column>
    </table>
    <table tableName="table2">
        <column columnName="column1">
            <dataType>varchar</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
            <isPrimaryKey>true</isPrimaryKey>
        </column>

        <column columnName="column2">
            <dataType>timestamp</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column3">
            <dataType>varchar</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column4">
            <dataType>decimal</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column5">
            <dataType>integer</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column6">
            <dataType>varchar2</dataType>
            <isNullAllowed>false</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column7">
            <dataType>date</dataType>
            <isNullAllowed>true</isNullAllowed>
            <defaultValue></defaultValue>
        </column>

        <column columnName="column8">
            <dataType>decimal</dataType>
            <isNullAllowed>false</isNullAllowed>
            <defaultValue></defaultValue>
        </column>
    </table>
</dbSchema>

@XmlRootElement(name="dbSchema")
public class DBSchema {

    private Vector<Table> tableList;

    /**
     * @return the tableList
     */
    public Vector<Table> getTableList() {
        return tableList;
    }

    /**
     * @param tableList the tableList to set
     */
    //XmLElementWrapper generates a wrapper element around XML representation
    //@XmlElementWrapper(name = "tableList") 
    //XmlElement sets the name of the entities
    @XmlElement(name = "table")
    public void setTabelList(Vector<Table> tableList) {
        this.tableList = tableList;
    }
}

@XmlRootElement(name = "table")
public class Table {

    private String tableName;

    private Vector<Column> columnList;

    public Table() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @return the tableName
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * @param pageId the pageId to set
     */
    @XmlAttribute(name="tableName")
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    /**
     * @return the columnList
     */
    public Vector<Column> getColumnList() {
        return columnList;
    }

    /**
     * @param columnList the columnList to set
     */
    //XmLElementWrapper generates a wrapper element around XML representation
    //@XmlElementWrapper(name = "columnList") 
    //XmlElement sets the name of the entities
    @XmlElement(name = "column")
    public void setColumnList(Vector<Column> columnList) {
        this.columnList = columnList;
    }

}

@XmlRootElement(name = "column")
public class Column {

    private String columnName = "";

    private String dataType = "";

    private boolean isNullAllowed = false;

    private boolean isPrimaryKey = false;

    private String defaultValue = "";

    public Column() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @return the columnName
     */
    public String getColumnName() {
        return columnName;
    }

    /**
     * @param columnName the columnName to set
     */
    @XmlAttribute
    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }

    /**
     * @return the dataType
     */
    public String getDataType() {
        return dataType;
    }

    /**
     * @param dataType the dataType to set
     */
    @XmlElement
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    /**
     * @return the isNullAllowed
     */
    public boolean isNullAllowed() {
        return isNullAllowed;
    }

    /**
     * @param isNullAllowed the isNullAllowed to set
     */
    @XmlElement
    public void setIsNullAllowed(boolean isNullAllowed) {
        this.isNullAllowed = isNullAllowed;
    }

    /**
     * @return the isPrimaryKey
     */
    public boolean isPrimaryKey() {
        return isPrimaryKey;
    }

    /**
     * @param isPrimaryKey the isPrimaryKey to set
     */
    @XmlElement
    public void setIsPrimaryKey(boolean isPrimaryKey) {
        this.isPrimaryKey = isPrimaryKey;
    }

    /**
     * @return the defaultValue
     */
    public String getDefaultValue() {
        return defaultValue;
    }

    /**
     * @param defaultValue the defaultValue to set
     */
    @XmlElement
    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }

}

Exception in thread "main" java.lang.NullPointerException
    at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:290)
    at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:254)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Scope.add(Scope.java:106)
    at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty$ReceiverImpl.receive(ArrayERProperty.java:195)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:524)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:143)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:200)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:173)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:142)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:151)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:169)
    at com.misys.importexportdata.helpers.SQLHandler.readDBDefinition(SQLHandler.java:99)
    at com.misys.importexportdata.helpers.SQLHandler.main(SQLHandler.java:29)


    private void readDBDefinition() {
        List<String> schemaList = FileHandler.getDirectoryContent(DefinedConstants.DB_DEFINITION_LOCATION);
        for (int i = 0; i < schemaList.size(); i++ ) {
            DBSchema schemaDetails = null;
            String schemaName = schemaList.get(i) ;
            if(schemaName.endsWith(".xml")) {
                try {
                    JAXBContext context = JAXBContext.newInstance(DBSchema.class);
                    Unmarshaller unMarshaller = context.createUnmarshaller();
                    File dbDefinitionFile = new File(DefinedConstants.DB_DEFINITION_LOCATION + schemaName);
                    schemaDetails = (DBSchema) unMarshaller.unmarshal(dbDefinitionFile);
                } catch (JAXBException e) {
                    e.printStackTrace();
                }
            }
            tableMap.put(schemaName, schemaDetails.getTableList()); 
        }
    }

我得到的 Stacktrace 是这样结束的:

java.lang.NullPointerException
    at com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:305)
    at com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Lister.java:269)
    at com.sun.xml.bind.v2.runtime.unmarshaller.Scope.add(Scope.java:121)
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty$ReceiverImpl.receive(ArrayERProperty.java:213)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:538)
    at com.sun.xml.bind.v2.runtime.unmarshaller.ValidatingUnmarshaller.endElement(ValidatingUnmarshaller.java:107)
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:158)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2973)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:258)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:229)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:140)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:123)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:754)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:735)

更新 1:SQLHandler 是具有 main 方法的 java 类。

更新 2: 伙计们,我发现了问题所在。这个问题很傻。我把注释拼错了。这导致了问题。

最佳答案

通常 JAXB 会为 Collection 属性调用 get,然后向其add。首先尝试初始化您的集合(tableListcolumnList)。

关于java - XML 解码期间的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12691875/

相关文章:

java - 正确修复 Java 10 提示 jaxb-impl 2.3.0 非法反射访问?

attributes - JAXB 无法处理带有冒号的属性 (:) in name?)

java - 阴影的概念

java - Spring Boot 现有域 .cert 文件实现我的应用程序(SSL)

java - 在 Java 中是否有 'this' 的静态版本

java - 存储 Java 包

java - JAXB 不创建成员变量和 getter 和 setter

java - 从原始帧缓冲区数据获取 jpg 图像

java - 使用 JAXB 解码具有不同/动态名称的元素

java - 如何使用 jaxb/moxy 管理多种 xml 格式