2012-12-17 54 views
1

我的JAXB解析器今天突然停止工作。它工作了幾個星期。我收到以下消息。我幾個星期沒有更改這個代碼。想知道這個設置是否好。JAXB問題 - 意外元素


編輯2:請有人可以幫助我!我無法弄清楚這一點。



編輯1: 以下運行相同的代碼我的驗收測試工作正常。我相信這是一個 類加載問題。我在JDK中使用JAXB和StAX。但是,當我部署到jboss 5.1時,出現下面的錯誤。使用1.6.0_26(本地)和1.6.0_30(開發服務器)。仍然困惑於解決方案。


意外元件(URI: 「」,本地: 「lineEquipmentRecord」)。預期 元件是 < {} switchType>,< {} leSwitchId>,< {} nodeAddress>,< {} LEID>,< {} telephoneSuffix>,< {} leFormatCode>,< {} groupIdentifier>,< {} telephoneNpa>,< {} telephoneLine>,< {} telephoneNxx>

這是我的數據編類:

import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.NoSuchElementException; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 
import javax.xml.stream.FactoryConfigurationError; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLStreamReader; 


public class PartialUnmarshaller<T> { 
    XMLStreamReader reader; 
    Class<T> clazz; 
    Unmarshaller unmarshaller; 

    public PartialUnmarshaller(InputStream stream, Class<T> clazz) throws XMLStreamException, FactoryConfigurationError, JAXBException { 
     this.clazz = clazz; 
     this.unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller(); 
     unmarshaller.setEventHandler(new ValidationEventHandler() { 

      @Override 
      public boolean handleEvent(ValidationEvent event) { 
       System.out.println(event.getMessage()); 
       return true; 
      } 
     }); 
     this.reader = XMLInputFactory.newInstance().createXMLStreamReader(stream); 

     /* ignore headers */ 
     skipElements(XMLStreamConstants.START_DOCUMENT); 
     /* ignore root element */ 
     reader.nextTag(); 
     /* if there's no tag, ignore root element's end */ 
     skipElements(XMLStreamConstants.END_ELEMENT); 
    } 

    public T next() throws XMLStreamException, JAXBException { 
     if (!hasNext()) 
      throw new NoSuchElementException(); 

     T value = unmarshaller.unmarshal(reader, clazz).getValue(); 

     skipElements(XMLStreamConstants.CHARACTERS, XMLStreamConstants.END_ELEMENT); 
     return value; 
    } 

    public boolean hasNext() throws XMLStreamException { 
     return reader.hasNext(); 
    } 

    public void close() throws XMLStreamException { 
     reader.close(); 
    } 

    private void skipElements(Integer... elements) throws XMLStreamException { 
     int eventType = reader.getEventType(); 

     List<Integer> types = new ArrayList<Integer>(Arrays.asList(elements)); 
     while (types.contains(eventType)) 
      eventType = reader.next(); 
    } 
} 

此類用於如下:

List<MyClass> lenList = new ArrayList<MyClass>(); 
PartialUnmarshaller<MyClass> pu = new PartialUnmarshaller<MyClass>(
     is, MyClass.class); 
while (pu.hasNext()) { 
    lenList.add(pu.next()); 
} 

的XML是解組:

<?xml version="1.0" encoding="UTF-8"?> 
<lineEquipment> 
    <lineEquipmentRecord> 
     <telephoneNpa>333</telephoneNpa> 
     <telephoneNxx>333</telephoneNxx> 
     <telephoneLine>4444</telephoneLine> 
     <telephoneSuffix>1</telephoneSuffix> 
     <nodeAddress>xxxx</nodeAddress> 
     <groupIdentifier>LEN</groupIdentifier> 
    </lineEquipmentRecord> 
    <lineEquipmentRecord> 
     <telephoneNpa>111</telephoneNpa> 
     <telephoneNxx>111</telephoneNxx> 
     <telephoneLine>2222</telephoneLine> 
     <telephoneSuffix>0</telephoneSuffix> 
     <nodeAddress>xxxx</nodeAddress> 
     <groupIdentifier>LEN</groupIdentifier> 
    </lineEquipmentRecord> 
</lineEquipment> 

最後,這裏是MyClass的:

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

/** 
* This class is used as an envelope to hold Martens 
* line equipment information. 
* @author spgezf 
* 
*/ 
@XmlRootElement(name="lineEquipmentRecord") 
public class MyClass { 

    private String telephoneNpa; 
    private String telephoneNxx; 
    private String telephoneLine; 

    private String telephoneSuffix; 
    private String nodeAddress; 
    private String groupIdentifier; 

    public MyClass(){  
    } 


    // Getters and Setters. 

    @XmlElement(name="telephoneNpa") 
    public String getTelephoneNpa() { 
     return telephoneNpa; 
    } 

    public void setTelephoneNpa(String telephoneNpa) { 
     this.telephoneNpa = telephoneNpa; 
    } 
    @XmlElement(name="telephoneNxx") 
    public String getTelephoneNxx() { 
     return telephoneNxx; 
    } 

    public void setTelephoneNxx(String telephoneNxx) { 
     this.telephoneNxx = telephoneNxx; 
    } 
    @XmlElement(name="telephoneLine") 
    public String getTelephoneLine() { 
     return telephoneLine; 
    } 

    public void setTelephoneLine(String telephoneLine) { 
     this.telephoneLine = telephoneLine; 
    } 


    @XmlElement(name="telephoneSuffix") 
    public String getTelephoneSuffix() { 
     return telephoneSuffix; 
    } 

    public void setTelephoneSuffix(String telephoneSuffix) { 
     this.telephoneSuffix = telephoneSuffix; 
    } 

    @XmlElement(name="nodeAddress") 
    public String getNodeAddress() { 
     return nodeAddress; 
    } 

    public void setNodeAddress(String nodeAddress) { 
     this.nodeAddress = nodeAddress; 
    } 

    @XmlElement(name="groupIdentifier") 
    public String getGroupIdentifier() { 
     return groupIdentifier; 
    } 

    public void setGroupIdentifier(String groupIdentifier) { 
     this.groupIdentifier = groupIdentifier; 
    } 


} 

回答

1

謝謝,這是我無法克服的類加載問題,所以我放棄了JAXB。

0

PartialUnmarshaller代碼爲我工作。下面是一個替代版本,它改變了可能效果更好的skipElements方法。

import java.io.InputStream; 
import java.util.NoSuchElementException; 

import javax.xml.bind.*; 
import javax.xml.stream.*; 

public class PartialUnmarshaller<T> { 
    XMLStreamReader reader; 
    Class<T> clazz; 
    Unmarshaller unmarshaller; 

    public PartialUnmarshaller(InputStream stream, Class<T> clazz) throws XMLStreamException, FactoryConfigurationError, JAXBException { 
     this.clazz = clazz; 
     this.unmarshaller = JAXBContext.newInstance(clazz).createUnmarshaller(); 
     unmarshaller.setEventHandler(new ValidationEventHandler() { 

      @Override 
      public boolean handleEvent(ValidationEvent event) { 
       System.out.println(event.getMessage()); 
       return true; 
      } 
     }); 
     this.reader = XMLInputFactory.newInstance().createXMLStreamReader(stream); 

     /* ignore headers */ 
     skipElements(); 
     /* ignore root element */ 
     reader.nextTag(); 
     /* if there's no tag, ignore root element's end */ 
     skipElements(); 
    } 

    public T next() throws XMLStreamException, JAXBException { 
     if (!hasNext()) 
      throw new NoSuchElementException(); 

     T value = unmarshaller.unmarshal(reader, clazz).getValue(); 

     skipElements(); 
     return value; 
    } 

    public boolean hasNext() throws XMLStreamException { 
     return reader.hasNext(); 
    } 

    public void close() throws XMLStreamException { 
     reader.close(); 
    } 

    private void skipElements() throws XMLStreamException { 
     while(reader.hasNext() && !reader.isStartElement()) { 
      reader.next(); 
     } 
    } 

}