Java 在jersey中使用XML文件进行post时出现SAXParseException

Java 在jersey中使用XML文件进行post时出现SAXParseException,java,forms,post,jersey,saxparseexception,Java,Forms,Post,Jersey,Saxparseexception,我在REST应用程序中使用jaxb。我想通过web表单发送一个XML文件。然后java类将解组InputStream private void unmarshal(Class<T> docClass, InputStream inputStream) throws JAXBException { String packageName = docClass.getPackage().getName(); JAXBContext context = JAXBCon

我在REST应用程序中使用jaxb。我想通过web表单发送一个XML文件。然后java类将解组
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);
}
我得到以下ParserException:

javax.xml.bind.UnmarshalException-带有链接异常:[org.xml.sax.saxparsexception:prolog中不允许包含内容。]

这个问题得到了普遍的回答,但我确信我的文件没有损坏。当我从具有相同文件的java类中调用代码时,不会引发异常

// 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;
}

XML头是否与下面的一样

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

@FormParam(“文件”)InputStream文件流的内容是file=MyFile.xml,而不是它的内容

验证操作后,确保您在验证器中使用的输入流是重置的。 如果不重置它,您可以得到许多奇怪的异常


我希望这会有帮助:)

是的。正如我所说:web表单和inputstream中使用的文件指的是同一个文件。必须说明两件事:1.
@FormParam(“文件”)inputstream文件流的内容是file=MyFile.xml。因此,这显然是接收文件内容的错误方法。2.)此处的
应用程序/x-www-form-urlencoded
类型可能错误;我认为
多部分/表单数据
更好。使用
@Context HttpServletRequest servletRequest
时,
servletRequest.getInputStream
除了一个prolog外,还提供了正确的流:
内容配置:表单数据;name=“file”;filename=“MyFile.xml”内容类型:text/xml
<?xml version='1.0' encoding='utf-8'?>