org.apache.cxf.interceptor.Errore: Unmarshalling Errore: carattere non valido (NULL, unicode 0) rilevato: non valgono in alcun contenuto

Sto usando un cxf webservice che utilizza il trasporto locale e l’accesso webservice applicazione java.
Webservice è la lettura di un file e l’invio tramite webservice chiamata. Sto usando la dimensione in byte 512. Supponiamo che la dimensione del file è di 1200. Primi due tentativo di recuperare il file è successo e per l’ultimo blocco io sono sempre org.apache.cxf.interceptor.Errore: Unmarshalling Errore: carattere non valido (NULL, unicode 0) rilevato: non è valido nei contenuti.

Qui chunk rappresenta 512 byte. Sto convertendo byte stringa e ritorno dal servizio web.Nell’ultimo pezzo solo 16 byte valore è pieno e i restanti sono riempiti con zeri.
Qualsiasi aiuto sarà apprezzato.
Sto usando cxf webservice 2.7.5, jdk1.7 ,Redhat Linux.

Stack trace:

org.apache.cxf.interceptor.Fault: Unmarshalling Error: Illegal character (NULL, unicode 0) encountered: not valid in any content
 at [row,col {unknown-source}]: [2,1]
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:808)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:629)
        at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:157)
        at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:103)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
        at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:800)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1592)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1490)
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
        at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622)
        at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:133)
        at $Proxy62.getJobLog(Unknown Source)
        at com.java.process.AClass.getMessage(AClass.java:468)
        at com.java.process.AClass.getXXXX(AClass.java:156)
        at com.java.process.AClass.main(CLIClientStartup.java:409)
Caused by: javax.xml.bind.UnmarshalException
 - with linked exception:
[com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character (NULL, unicode 0) encountered: not valid in any content
 at [row,col {unknown-source}]: [2,1]]
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:436)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:372)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:349)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.doUnmarshal(JAXBEncoderDecoder.java:769)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.access$100(JAXBEncoderDecoder.java:94)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder$1.run(JAXBEncoderDecoder.java:797)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:795)
        ... 23 more
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Illegal character (NULL, unicode 0) encountered: not valid in any content
 at [row,col {unknown-source}]: [2,1]
        at com.ctc.wstx.sr.StreamScanner.constructNullCharException(StreamScanner.java:630)
        at com.ctc.wstx.sr.StreamScanner.throwInvalidSpace(StreamScanner.java:660)
        at com.ctc.wstx.sr.BasicStreamReader.readTextPrimary(BasicStreamReader.java:4576)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2879)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1072)
        at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:196)
        at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:370)
        ... 29 more
InformationsquelleAutor Shriram | 2014-06-27



2 Replies
  1. 3

    Da qui

    Il problema che causa questi XmlExceptions è che i dati
    leggere o caricato contiene caratteri che sono illegali secondo il
    Le specifiche XML. Quasi sempre, questi personaggi sono in ASCII
    carattere di controllo gamma (si pensi whacky personaggi come null, campana,
    backspace, ecc). Questi non sono personaggi che non hanno alcuna attività
    in XML dei dati; si tratta di caratteri che devono essere rimossi,
    di solito dopo aver trovato la loro strada verso i dati da un file in formato
    le conversioni, come quando qualcuno tenta di creare un file XML di Excel
    i dati, o di esportare i propri dati in XML in un formato che può essere memorizzato come
    binario.

    E un esempio per la sanificazione dei dati prima di effettuare l’unmarshalling.
    Errore su XML non valido caratteri in Java

    Forse si dovrebbe usare qualcosa al di fuori della scatola per il trasferimento di file, come MTOM
    controlla qui

    O si potrebbe utilizzare CDATA sintassi per avvolgere il contenuto, in modo che la parte che restituisce null
    sarà ricevuto in modo letterale.

    • grazie per la risposta. L’eccezione di cui sopra è causa di stringa contiene zero l’ultimo blocco. Negli ultimi continuo zeri fanno nulla[come in ascii/utf-8] così è il lancio di una eccezione come questo.
    • Così quegli zeri sono parte del suo contenuto? Che cosa circa usando MTOM di inviare il file? Forse potrebbe essere una soluzione?
    • Controllare il mio aggiornamento. Forse CDATA sintassi potrebbe essere una soluzione per il vostro problema?
    • Ha fatto la mia risposta di aiuto?
    • CDATA non fa caratteri non validi validi. Sarà ancora fare l’XML non convalida.
  2. 0

    Andare per le proprietà del progetto e modificare il progetto di una codifica UTF-8.
    Utilizzare il seguente per il gestore di marshalling e unmarchaller

        private static void exportToXML(JAXBContext ctx , Object obj , OutputStream stream) throws Exception{
        try {
            Marshaller m = ctx.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    
            m.marshal(obj, stream);
        } catch (JAXBException e) {
            e.printStackTrace();
        }       
    }
    
    private static Object importXML(JAXBContext ctx , String xmlStr) throws Exception {
        try {           
            Unmarshaller m = ctx.createUnmarshaller();
            ByteArrayInputStream is = new ByteArrayInputStream(xmlStr.getBytes("UTF-8"));
    
            return m.unmarshal(is);
    
        } catch (Throwable e) {e.printStackTrace();}
    
    }

Lascia un commento