xml 파일에서 입력 스트림을 가져 오는 웹 서비스가 있습니다. 이제, 나는 동일한 입력 스트림으로 검증하고 그것을 읽고 싶다. 마크를 사용하고 재설정했습니다.유효성을 검사하고 동일한 입력 스트림을 사용하여 읽기
Glassfish 및 Websphere에서 제대로 작동합니다. 그러나 openEJB를 사용하여 통합 테스트를 실행하면 유효성 검사 후 스트림이 닫힙니다. 나는 간단한 예를 들어 그것을 재현 할 수있다.
어떻게하면 좋을까요? 유효성 검사기 구현은 항상 동일합니다. 그러나 모든 환경은 inputstream의 또 다른 구현을 사용합니다.
는public class XMLReader {
public static void main(String[] args) {
try {
XMLReader reader = new XMLReader();
InputStream stream = new BufferedInputStream(new FileInputStream(
new File("myXML.xml")));
reader.read(stream);
} catch (Exception e) {
e.printStackTrace();
}
}
public void read(InputStream xmlInputStream) throws SAXException,
IOException {
if (xmlInputStream.markSupported()) {
xmlInputStream.mark(0);
validateXML(xmlInputStream);
xmlInputStream.reset();
readXML(xmlInputStream);
}
}
private void readXML(InputStream xmlInputStream) {
// READ xmInputStream with STAX, JAXB, etc. whatever
}
private void validateXML(InputStream xmlInputStream) throws SAXException,
IOException {
Source schemaFile = new StreamSource(new File("myXSD.xsd"));
Source xmlFile = new StreamSource(xmlInputStream);
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
try {
validator.validate(xmlFile);
System.out.println("is valid");
} catch (SAXException e) {
System.out.println("is NOT valid");
System.out.println("Reason: " + e.getLocalizedMessage());
}
}
}
예외 :
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
at java.io.BufferedInputStream.reset(BufferedInputStream.java:414)
at xmltest.XMLReader.read(XMLReader.java:36)
at xmltest.XMLReader.main(XMLReader.java:27)
네트워크에서 읽는다면이 사실을 이해할 수 있습니다. 서버에 배포 할 때 실제 파일에서 XML을 읽는 중입니까? –
XML 파일을 REST 서비스를 통해 문자열로 가져옵니다. 그 String은 Inputstream을 만드는 데 사용되었습니다. 맨 위에있는 예제는 동작을 보여주기위한 것입니다. – pL4Gu33
문자열에서 InputStream을 생성하기위한 코드를 보여주십시오. 임의로 긴 String에 내용을로드하는 것은 일반적으로 좋은 생각이 아닙니다. 임시 파일에 복사하십시오 (아마도 [java.nio.file.Files.copy (...)]를 사용하십시오 (http://docs.oracle.com/javase/8/docs/api/java/nio/file/). Files.html # copy-java.io.InputStream-java.nio.file.Path-java.nio.file.CopyOption ...-)) 먼저. 감사합니다. –