2012-10-02 7 views
3

동일한 프로젝트에서 나와 작동하는 동일한 XML에서 다음 XML을 개발했습니다. 그러나 이러한 것들을 unmarshall하려고 할 때 나는 NullPointerException을 얻고있다.XML 언 마샬링 중에 NullPointerException이 발생했습니다.

저는 모든 자바 클래스를 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()); 
     } 
    } 

스택 트레이스를 도와주세요 I는 다음과 같이 끝을 얻고있다 :

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) 

UPDATE 1 : SQLHandler의 주요 방법으로 자바 클래스입니다.

업데이트 2 : 사람이 문제를 발견했습니다. 문제는 매우 어리 석다. 주석의 철자가 잘못되었습니다. 그리고 그 문제로 이어집니다.

+0

줄이 무엇입니까? SQLHandler.java:29? –

+0

@StefanBe - SQLHandler는 main 메소드가있는 자바 클래스입니다. – dareurdream

답변

1

일반적으로 JAXB는 속성의 경우 get을 호출 한 다음 add을 호출합니다. 컬렉션을 먼저 초기화하십시오 (tableListcolumnList).

+0

나는 누가 여기에 있는지 확실하지 않습니다. 제발 링크를 봐 - http://java.net/projects/jaxb/lists/users/archive/2011-05/message/52 – dareurdream

+0

한번 해봐! :) –

+0

영향 없음. 그것은 동일합니다. 어쨌든 나는 해결책을 발견하고 위에 업데이트했다. 시간과 답변에 감사드립니다. – dareurdream

0

문제에 대한 답은 official JAXB forum에서이 인용에있다 :

유형 목록의 속성에 대한 세터를 기대하지 않습니다 JAXB의 Unmarshaller에; 다른 자식을 추가하려면 x.getSomeList(). add (y)를 사용하기 만하면됩니다. 목록에 대한 getter가 으로 작성된 일반적인 방법은이 예제를 참조하십시오 (이런 식으로 수행하는 데는 여러 가지 이유가 있습니다).

public class ListsType { 

    protected List<Integer> numbers; 

    public List<Integer> getNumbers() { 
     if (numbers == null) { 
      numbers = new ArrayList<Integer>(); 
     } 
     return this.numbers; 
    } 
} 

전체 예를 들어, here를 클릭하십시오 : 중요

는 컬렉션을 초기화 여부,하지만 당신의 수집에 대한 getter 메소드가 null을 반환하지 않습니다 너무 많이하지 않습니다.

관련 문제