Pregunta

Yo uso jaxb en mi aplicación REST. Quiero enviar un archivo XML a través de un formulario web. A continuación, la clase Java se deserializar el InputStream.

private void unmarshal(Class<T> docClass, InputStream inputStream)
    throws JAXBException {
    String packageName = docClass.getPackage().getName();
    JAXBContext context = JAXBContext.newInstance(packageName);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    Object marshaledObject = unmarshaller.unmarshal(inputStream);
}

El jsp-File que desencadena el método unmarshal tiene una form que se parece a esto:

<form action="#" method="POST">
    <label for="id">File</label>
    <input name="file" type="file" />
    <input type="submit" value="Submit" />
</form>

Me sale el siguiente ParserException:

javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: Content is not allowed in prolog.].

La pregunta fue respondida en general, aquí , pero estoy seguro de que mi archivo no está dañado. Cuando llamo el código dentro de un java-Classwith el mismo archivo se lanza una excepción.

// causes no exception
File file = new File("MyFile.xml");
FileInputStream fis = new FileInputStream(file);
ImportFactory importFactory = ImportFactory.getInstance();
importFactory.setMyFile(fis);

// but when i pass the file with a web form
@POST
@Produces(MediaType.TEXT_HTML)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response create(@FormParam("file") InputStream filestream) {
    Response response;

    // is a BufferedInputStream, btw    
    LOG.debug("file is type: " + filestream.getClass().getName());

    try { 
        ImportFactory importFactory = ImportFactory.getInstance();
        importFactory.setMyFile(filestream);

        Viewable viewable = new Viewable("/sucess", null);
        ResponseBuilder responseBuilder = Response.ok(viewable);
        response = responseBuilder.build();

    } catch (Exception e) {
        LOG.error(e.getMessage(), e);
        ErrorBean errorBean = new ErrorBean(e);
        Viewable viewable = new Viewable("/error", errorBean);
        ResponseBuilder responseBuilder = Response.ok(viewable);
        response = responseBuilder.build();
    }
    return response;
}
¿Fue útil?

Solución

El contenido de @FormParam ( "archivo") filestream InputStream era file = myfile.xml y no su contenido.

Otros consejos

¿Se parece la cabecera XML como la de abajo?

<?xml version='1.0' encoding='utf-8'?>

Asegúrese de que el InputStream que utilice en el validador es restablecer después de la operación de validación. Sin restablecer ella se pueden conseguir muchas excepciones extrañas.

Espero que le ayudará:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top