我有一个类,用于将来自第三方源(我无法控制其内容)的 XML 进行取消编组。以下是取消编组的片段:
JAXBContext jContext = JAXBContext.newInstance("com.optimumlightpath.it.aspenoss.xsd");
Unmarshaller unmarshaller = jContext.createUnmarshaller() ;
StringReader xmlStr = new StringReader(str.value);
Connections conns = (Connections) unmarshaller.unmarshal(xmlStr);
Connections
是一个使用 xjc 从 dtd->xsd->class 自动生成的类。包 com.optimumlightpath.it.aspenoss.xsd
包含所有这样的类。
我收到的 xml 包含 DOCTYPE 中的相对路径。基本上,str.value
包含:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE Connections SYSTEM "./dtd/Connections.dtd">
<Connections>
...
</Connections>
这个Java 1.5应用程序可以成功运行。为了避免上述错误,我不得不在项目根目录下创建一个./dtd目录,并包含所有的dtd文件(不确定为什么要这样做,但我们会解决这个问题)。
后来,我在Tomcat 5.5上创建了一个使用上述类的Web服务。在unmarshal行上,我收到了 [org.xml.sax.SAXParseException: Relative URI "./dtd/Connections.dtd"; can not be resolved without a document URI.]
的错误。我已经尝试在每个相关文件夹(项目根目录、WebContent、WEB-INF、Tomcat工作目录等)中创建./dtd,但都没有成功。
问题#1:我应该将./dtd放在哪里,以便类在作为Tomcat Web服务运行时可以找到它?是否需要进行任何Tomcat或服务配置以使目录被识别?
问题#2:这个类为什么需要dtd文件?难道它没有在dtd->xsd->class的注释中获得反序列化所需的所有信息吗?我已阅读过许多关于禁用验证、设置EntityResource和其他解决方案的帖子,但是这个类并不总是部署为Web服务,我不想有两个代码分支。