SaxParseException ao fazer postagem com um arquivo XML em Jersey
-
20-09-2019 - |
Pergunta
Eu uso o JAXB no meu aplicativo REST. Quero enviar um arquivo XML por meio de um formulário da Web. Então a classe Java irá solucionar o 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);
}
O arquivo JSP que desencadeia o unmarshal
O método tem um form
que se parece com o seguinte:
<form action="#" method="POST">
<label for="id">File</label>
<input name="file" type="file" />
<input type="submit" value="Submit" />
</form>
Eu recebo a seguinte parserexception:
javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: Content is not allowed in prolog.]
.
A pergunta foi respondida em geral aqui, mas tenho certeza de que meu arquivo não está corrupto. Quando eu chamo o código de uma classe Java com o mesmo arquivo, nenhuma exceção é lançada.
// 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;
}
Solução
O conteúdo do @FormParam ("FILE") inputStream filestream foi o arquivo = myfile.xml e não é o conteúdo.
Outras dicas
O cabeçalho XML se parece com o abaixo?
<?xml version='1.0' encoding='utf-8'?>
Certifique -se de que o InputStream que você usa no validador seja Redefinir Após a operação de validação. Sem redefini -lo, você pode obter muitas exceções estranhas.
Eu espero que isso ajude :)