我有一个 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已经关闭(但不包括本地)
这有什么问题吗?
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);
}