我有一个RESTful Web服务,我正在使用Java 1.6在Tomcat 6上部署,我看到了一些奇怪的行为.我正在使用大约5个其他war文件部署这个特定的war文件.有问题的Web应用程序还定期以xml格式向远程服务器发送状态消息,所有XML绑定都是使用JAXB 2.1.13完成的.初始部署后,JAXB绑定似乎无法正常工作.也就是说,如果我启动tomcat并等待状态消息被发送,我会收到以下错误:
javax.xml.bind.JAXBException: class StatusMessage nor any of its super class is known to this context.
Run Code Online (Sandbox Code Playgroud)
(为简洁起见,我省略了完全限定的类名).对RESTful服务的任何传入请求也会抛出相同的异常.
如果我在每次战争中打包所有库,我都没有看到这个问题,但是我试图不这样做,因为我的WAR文件变得非常臃肿.JAX库被包装在这场战争中,但像Spring这样的东西, commons-*,hibernate,在tomcat/lib中.有没有人有任何想法可能导致这种奇怪的部署顺序敏感性?
这里有一些代码细节,每次触发状态消息时都会发生以下情况:
JAXBElement<StatusMessage> el = ( new ObjectFactory() ).createHeartbeat( statusMessage );
ApiUtils apiUtil = new ApiUtils();
NamespaceFilter outFilter = new NamespaceFilter("http://middleware/status", true);
String xml = apiUtil.makeXml( el, "com.package.path.status", ApiUtils.getFormatXMLSetting(), ApiUtils.getValidateXMLSetting(), outFilter);
Run Code Online (Sandbox Code Playgroud)
makeXML调用如下所示:
public String makeXml(JAXBElement el, String packageName, Boolean formatXml, Boolean validateXml, NamespaceFilter outFilter) throws JAXBException,
SAXException, UnsupportedEncodingException, IOException{
// Marshal XML
JAXBContext jaxbContext = JAXBContext.newInstance( packageName );
Marshaller …Run Code Online (Sandbox Code Playgroud)