J'utilise jaxb dans mon application REST. Je veux envoyer un fichier XML via un formulaire Web. Alors la classe java démasha le InputStream
.SAXParseException lors de la publication d'un fichier XML dans le maillot
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);
}
Le jsp-fichier qui déclenche la méthode unmarshal
a une form
qui ressemble à ceci:
<form action="#" method="POST">
<label for="id">File</label>
<input name="file" type="file" />
<input type="submit" value="Submit" />
</form>
Je reçois la ParserException suivante:
javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: Content is not allowed in prolog.]
.
La question a été répondue en général here, mais je suis sûr que mon fichier n'est pas corrompu. Lorsque j'appelle le code depuis une classe java avec le même fichier, aucune exception n'est levée.
// 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;
}
Deux choses doivent être dites: 1.) Le contenu de '@FormParam ("file") InputStream filestream' était file = myfile.xml. Donc, c'était sûrement la mauvaise approche pour recevoir le contenu du fichier. 2.) Le type 'application/x-www-form-urlencoded' est probablement faux ici; Je pense que 'multipart/form-data' est meilleur. Lors de l'utilisation de '@Context HttpServletRequest servletRequest', le' servletRequest.getInputStream' délivre le flux de droite, mis à part un prologue: 'Content-Disposition: form-data; name = "file"; filename = "MyFile.xml" Content-Type: text/xml' – cuh