2013-04-23 11 views
5

Non so più cosa fare. Tutto sembra corretto; input Output.Fine prematura del file utilizzando JAXB e Unmarshaller. L'xml della risposta mi sembra valido

Genero file xml e invio ad alcuni servizi per la convalida.

La risposta è:

11:10:34,922 INFO [STDOUT] printing out the input stream 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Response> 
    <Method name="XML/Release/New" time="2013-04-23T15:10:35.1446238Z"> 
     <ResponseStatus>100</ResponseStatus> 
    </Method> 
</Response> 
finished printing out the input stream 
11:10:34,922 INFO [STDOUT] got the unmarshaller 
11:10:34,925 ERROR [PRNDataAccessUtil] Caught an error: javax.xml.bind.UnmarshalException 
- with linked exception: [org.xml.sax.SAXParseException: Premature end of file.] : null 

Il codice:

try { 
      out = connection.getOutputStream(); 
      ByteArrayOutputStream bos = PRNPostNewsReleaseUtil.createNewsReleaseXml(newsRelease); 
      bos.writeTo(out); 

      JAXBContext context = JAXBContext.newInstance(Response.class.getPackage().getName()); 
      in = connection.getInputStream(); 

      BufferedReader inp = new BufferedReader(new InputStreamReader(in)); 
      System.out.println("printing out the input stream"); 
      String line; 
      while((line = inp.readLine()) != null) { 
       System.out.println(line); 
      } 
      System.out.println("finished printing out the input stream"); 

      Unmarshaller unmarshaller = context.createUnmarshaller(); 
      response = (Response) unmarshaller.unmarshal(in); 

     } catch (Exception ex) { 
      log.error("Caught an error: " + ex + " : " + ex.getMessage()); 
      return null; 
     } finally { 
      if (null != in) connection.disconnect(); 
     } 
+0

Ho lottato con questo per molto tempo. E si è risolto senza che io cambiassi niente. Posso solo supporre che potrebbe essere un errore relativo all'eclissi o al server weblogic. –

risposta

7

Hai trovato l'errore perché la InputStream è stata avanzata alla fine durante l'uscita. Supponendo che il buffer nel tuo BufferedReader sia sufficientemente grande da contenere l'intero documento XML, puoi resettarlo dopo l'output e quindi senza un raggio.

+0

hmmmm sembra probabile. lo metterò alla prova. cancellerò i sysouts, ho solo bisogno di vedere il contenuto. – iCodeLikeImDrunk

+1

che ha fatto il trucco! ancora strano però, ho un altro metodo che effettivamente posta questo input e faccio anche il sysout dell'output, in qualche modo funziona senza problemi. Grazie!! – iCodeLikeImDrunk

1

Un'altra cosa da notare qui è anche se non si sta leggendo il buffer esplicitamente nel codice ma si ha un watch di espressione che legge l'input, finirebbe per avere lo stesso effetto di incrementare la testa del flusso. Lo ho capito dopo aver passato ore a eseguire il debug di questa eccezione.

3

Una volta mi è capitato di utilizzare il nome di classe errato per creare l'oggetto JAXBContext, quindi quando ho provato a eseguire il marshall di un oggetto, è stato creato un file XML vuoto, rendendo impossibile l'unmarshaller.

Quindi assicurati che l'oggetto JAXBContext sia istanziato con la classe che stai cercando di eseguire.

Problemi correlati