从 XSD 解组 XML 失败,JAR 执行显示“java.io.IOException:缓冲区已关闭”

问题描述 投票:0回答:1

我有一个 java 代码,可以从 PDF (Apache PDFBox) 中提取 Xml 部分并将其解组为 java 类。

在使用 IntelliJ 本地执行时,一切正常,但是当我在 openshift 集群上部署 jar 时,unmarshal 出现“java.io.IOException:缓冲区已关闭”

从我的 PDF 中提取一个列表

然后,我创建一个像这样的解组器:

try {
      JAXBContext context = JAXBContext.newInstance(typeClasse.getClass());
      Unmarshaller unmarshaller = context.createUnmarshaller();
      SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
      String xsdFilePath = getXSD();
      Schema schema = factory.newSchema(this.getClass().getResource("/" + xsdFilePath));
      unmarshaller.setSchema(schema);
      unmarshaller.setEventHandler(event -> false);
      return unmarshaller;
    } catch (JAXBException | SAXException e) {
      throw new UnmarshallException(e);
    }

typeClasse 是我的输出解组类,getXSD() 为我提供根 XSD 定义的路径,我的所有 XSD 都位于资源 java 文件夹的同一目录“xsd”中,并且 getXSD() 返回的一个包括所有其他 XSD。路径就像“xsd/myparentXSD.xsd”

然后,使用我的列表 (myList),我执行此代码,返回一个列表,其中 T 是 typeClasse。

myList.stream()
        .map(myObject -> unmarshallFichier(myObject, unmarshaller))
        .collect(Collectors.toList());

unmarshaller 是下面的一个细节,unmarshallFichier 是:

try {
  StreamSource stream = new StreamSource(myObject);
  JAXBElement<?> jaxbElement = unmarshaller.unmarshal(stream, typeClasse.getClass());
  return (T) jaxbElement.getValue();
} catch (JAXBException e) {
  throw new UnmarshallException(e);
}

但是在 openshift 上,此代码是错误的并产生 java.io.IOException: Buffer已经关闭(但不包括本地)

这有什么问题吗?

java xml xsd unmarshalling
1个回答
0
投票
StreamSource stream = new StreamSource(myObject);

在这种情况下,

myObject
是什么?它是InputStream还是Reader

我猜您忘记关闭InputStream 或Reader。您应该在

try with resources
块内执行此操作,该块将在 InputStream / Reader 上调用
close()

例如:

try (InputStream in = openInputStream(...)) {
   StreamSource stream = new StreamSource(in);
   doStuff(stream);
}
© www.soinside.com 2019 - 2024. All rights reserved.