Eya*_*yal 7 java spring tomcat sax amazon-s3
我在同一个Tomcat上运行的两个单独的战争中使用Amazon S3 SDK.我在我的一个Spring服务的@PostConstruct中初始化了一个AmazonS3Client.
如果我分开运行这些战争,一切通常都可以.如果我一起运行它们中的一个 - 第二个启动它 - 抛出以下异常:
com.amazonaws.AmazonClientException:无法初始化XMLReader的sax驱动程序
我有一个解决方法,在捕获AmazonClientException后,如果发生这种情况,我会设置以下System属性:
try {
init();
} catch (AmazonClientException ase) {
System.setProperty("org.xml.sax.driver", "com.sun.org.apache.xerces.internal.parsers.SAXParser");
init();
}
Run Code Online (Sandbox Code Playgroud)
但这当然是可怕的.有一个更好的方法吗?为什么会出现这种情况?
更新:首先,似乎将AmazonS3Client的初始化移出@PostConstruct并且懒洋洋地初始化它可以完全阻止此错误.但显然有时候它仍然会发生 - 即使我只进行一场战争而不是两场战争.
XMLReader通过一系列步骤来识别要使用的驱动器.引用文档
查看AWS SDK的代码......
public XmlResponsesSaxParser() throws AmazonClientException {
// Ensure we can load the XML Reader.
try {
xr = XMLReaderFactory.createXMLReader();
} catch (SAXException e) {
// oops, lets try doing this (needed in 1.4)
System.setProperty("org.xml.sax.driver", "org.apache.crimson.parser.XMLReaderImpl");
try {
// Try once more...
xr = XMLReaderFactory.createXMLReader();
} catch (SAXException e2) {
throw new AmazonClientException("Couldn't initialize a sax driver for the XMLReader");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这些代码.
这些要点使调试问题变得更加困难.我能做出的最有根据的猜测是,深红色解析器可以在一个类加载路径中访问,但在另一个类加载路径中不存在.找到问题的一种结论性方法是在代码上设置一个断点,该代码试图实例化读者并找出潜在的根本原因.