近日在把程序从jboss移动到jetty服务器时,使用jaxb的地方在Marshal的时候会抛上面的异常,堆栈信息如下:

ERROR [com.cmri.mcss.web.servlet.confmgmt.ConfPicServlet:65] Could not parse the XML stream.
javax.xml.ws.soap.SOAPFaultException: Could not parse the XML stream.
        at org.apache.cxf.jaxws.DispatchImpl.mapException(DispatchImpl.java:235)
        at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:264)
        at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:195)

.....(程序调用的地方,省略部分)

Caused by: org.apache.cxf.interceptor.Fault: Could not parse the XML stream.
        at org.apache.cxf.databinding.source.XMLStreamDataWriter.write(XMLStreamDataWriter.java:85)
        at org.apache.cxf.databinding.source.XMLStreamDataWriter.write(XMLStreamDataWriter.java:49)
        at org.apache.cxf.databinding.source.XMLStreamDataWriter.write(XMLStreamDataWriter.java:45)
        at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:114)
        at org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
        at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:471)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:301)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:253)
        at org.apache.cxf.endpoint.ClientImpl.invokeWrapped(ClientImpl.java:288)
        at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:257)
        ... 38 more
Caused by: javax.xml.stream.XMLStreamException: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: Prefix cannot be null]
        at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:339)
        at org.apache.cxf.databinding.source.XMLStreamDataWriter.write(XMLStreamDataWriter.java:82)
        ... 48 more
Caused by: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: Prefix cannot be null]
        at javax.xml.bind.util.JAXBSource$1.parse(JAXBSource.java:225)
        at javax.xml.bind.util.JAXBSource$1.parse(JAXBSource.java:210)
        at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:335)
        ... 49 more
Caused by: javax.xml.bind.MarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: Prefix cannot be null]
        at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
        at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:254)
        at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:103)
        at javax.xml.bind.util.JAXBSource$1.parse(JAXBSource.java:222)
        ... 51 more
Caused by: javax.xml.stream.XMLStreamException: Prefix cannot be null
        at org.apache.cxf.staxutils.StreamWriterContentHandler.startElement(StreamWriterContentHandler.java:223)
        at org.xml.sax.helpers.XMLFilterImpl.startElement(XMLFilterImpl.java:527)
        at com.sun.xml.bind.v2.runtime.output.SAXOutput.endStartTag(SAXOutput.java:124)
        at com.sun.xml.bind.v2.runtime.XMLSerializer.endAttributes(XMLSerializer.java:302)
        at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:588)
        at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:312)
        at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
        at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:325)
        ... 54 more
Caused by: javax.xml.stream.XMLStreamException: Prefix cannot be null
        at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeStartElement(XMLStreamWriterImpl.java:1284)
        at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.writeStartElement(XMLStreamWriterImpl.java:1262)
        at org.apache.cxf.staxutils.StreamWriterContentHandler.startElement(StreamWriterContentHandler.java:197)
        ... 61 more

看问题好像是使用sun默认的Marshaller实现来转换Object和xml时出了问题。google上给出的答案不一,但是基本上的意思是要替换Marshaller的实现类。网上碰到类似问题的回答基本有下面几种:

1.javase6(没有细版本,我用的是1.6.0_29)的rt.jar中默认jaxb的API是2.0版本(看了一下本地jdk中jaxb的源代码,代码中没有标注版本号,但是代码中作者注释的日期是2003年,jaxb2.1的实现貌似是06年发布的),需要把jaxb2.1 api的包放到classpath中,但是事实上这个jar包已经在我的classpath中(2.1的实现中,类名和JDK的实现完全相同),于是猜想可能是class加载顺序的问题(jetty在加载class时,指定了某些类是属于System Class,jetty关于classloading的解释:http://docs.codehaus.org/display/JETTY/Classloading),查看jetty部分源码发现jetty定义的system class规则如下(源码在org.eclipse.jetty.webapp.WebAppContext类中):

// System classes are classes that cannot be replaced by
    // the web application, and they are *always* loaded via
    // system classloader.
    public final static String[] __dftSystemClasses =
    {
        "java.",                            // Java SE classes (per servlet spec v2.5 / SRV.9.7.2)
        "javax.",                           // Java SE classes (per servlet spec v2.5 / SRV.9.7.2)
        "org.xml.",                         // needed by javax.xml
        "org.w3c.",                         // needed by javax.xml
        "org.apache.commons.logging.",      // TODO: review if special case still needed
        "org.eclipse.jetty.continuation.",  // webapp cannot change continuation classes
        "org.eclipse.jetty.jndi.",          // webapp cannot change naming classes
        "org.eclipse.jetty.plus.jaas.",     // webapp cannot change jaas classes
        "org.eclipse.jetty.websocket.WebSocket", // WebSocket is a jetty extension
        "org.eclipse.jetty.websocket.WebSocketFactory", // WebSocket is a jetty extension
        "org.eclipse.jetty.servlet.DefaultServlet" // webapp cannot change default servlets
    } ;

因为system class不能被overload,所以在classpath中就另外的实现类,也是会被加载的。于是想是不是把jaxb-api-2.1.jar放到jre的endorsed目录下(默认没有,自己建)是不是会优先加载,就可以覆盖掉JDK自带的实现。试了一下,还是不行。(顺便贴一篇文章名字叫: Using JAXB 2.1 with j2se 6    http://matrix.iteye.com/blog/284128)

2.用Woodstox替代JDK自带的实现

从Woodstox的网站下到依赖的jar包,放到jetty的classpath中(在jetty的lib下建一个woodstox目录,在start.ini中添加该目录),一试果然成功了。把Woodstox的jar包放到endorsed目录,不添加到jetty的classpath目录,测试,不行!这个问题就有点纠结了(没想通为什么,难道是放到jre的endorsed目录的jar包没有被load?)。放到classpath下面程序在找JAXB的实现时会自动使用Woodstox的原因是因为在Woodstox的jar包中META-INF目录下的services目录下定义有javax.xml.stream.XMLEventFactory

javax.xml.stream.XMLInputFactory

javax.xml.stream.XMLOutputFactory

说实话META-INF中定义一些信息这个地方,我也没还是没弄清楚!

程序可以run起来了,还剩2个问题需要继续深入:

1.jre的endorsed的目录中的类会被当成System class优先被加载吗?会的话,为什么会出现上面的状况(woodstox的jar包放到jre的endorsed目录下不行,放到classpath下反而可以)。

2.Woodstox是怎么做到被优化作为JAXB的实现的

javax.xml.stream.XMLStreamException: Prefix cannot be null相关推荐

  1. java elementtext_java命名空间javax.xml.stream接口xmlstreamreader成员方法: getelementtext定义参考...

    读取纯文本元素的内容,如果不是纯文本元素,则抛出异常.无论 javax.xml.stream.iscoalescing 的值如何,此方法始终返回组合的内容. 前置条件:当前事件是 start_elem ...

  2. POI操作EXCEL2007,报javax.xml.stream.XMLEventFactory.newFactory()错误!

    转载:https://blog.csdn.net/Amo_te_ama_me/article/details/50536292 看别人使用POI做过操作EXCEL,今天也下载了个例子使用POI操作ex ...

  3. android studio找不到javax.xml.stream.*问题记录

    stream包在jdk1.5以上开始支持,网上大都是升级jdk版本.但本地已是1.8版本,且项目也设置为1.8版本,但始终无效. 最后在这边博客中找到办法直接依赖本地jar文件即可! 链接地址:htt ...

  4. Caused by: javax.xml.stream.FactoryConfigurationError: Provider com.ctc.wstx.stax.WstxInputFactory n

    可以下载这个jar:wstx-asl-3.2.3.jar (网上很多下载)放到domain的lib下面. 这个lib的类加载顺序,是servers级别的,是web应用的上一级,一般jdbc的驱动jar ...

  5. java xml出错,Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException...

    Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException解决办法: 利用Java操作X ...

  6. Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    转自:https://www.jb51.net/article/98644.htm Java xml出现错误 javax.xml.transform.TransformerException: jav ...

  7. java javax.xml.ws_调用webservice的问题 – javax.xml.ws.WebServiceE...

    我有一个wsdl文件,很多xsd文件,jxb绑定文件.我使用Apache CXF cxf-codegen-plugin创建了一个Web服务客户端.创建Java类没有任何错误.但是当我尝试调用任何生成的 ...

  8. java.lang.AbstractMethodError: javax.xml.transform.TransformerFactory

    java.lang.AbstractMethodError: javax.xml.transform.TransformerFactory 1.环境及报错场景 2.报错数据 3.问题分析 4.解决 5 ...

  9. Android老項目出现javax/xml/bind/JAXBException异常问题解决

    有時候報錯: > Task :app:compileDebugJavaWithJavac FAILED Gradle may disable incremental compilation as ...

最新文章

  1. 福利 | 放送AI华人库试用名额!专项代码找到领域专家
  2. 表格数据清空还能恢复吗_数据恢复大师:清空回收站文件如何恢复?
  3. Linux下的零拷贝
  4. MFC透明桌面flash金鱼
  5. viewState 与session[转]
  6. 从此,懂一点CDMA
  7. python解析json多行_用Python将JSON单行解析为多行CSV
  8. react调用api等待返回结果_程序员:RPC远程调用原理浅析
  9. poj 2955 Brackets 区间DP
  10. 20个经典模拟电路(详细图文)
  11. 故宫商业大跃进 逐渐失控的IP洪流
  12. go日志收集系统项目简介
  13. 暑期实习-京东广告架构组三面面经
  14. jena mysql_在Jena框架下基于MySQL数据库实现本体的存取操作
  15. 仙境传说 第一章之四 卢渊*梦魇过后的情缘
  16. STL的使用和背后数据结构
  17. 吐槽智能手机上那些不爽的事
  18. python知识点智能问答_【每日一荐】智能问答API
  19. 不破坏背景的情况下在线ps替换文字
  20. 横河便携式pH计PH72-21-E-AA

热门文章

  1. 《Windows环境下32位汇编语言程序设计》 第五章笔记
  2. js作为websocket client,服务用java 点对点、一对多聊天
  3. java中级工程师需要学习那些知识?
  4. SAR-Scape处理SBAS-InSAR报错原因之一
  5. 从零开始学ros小车仿真
  6. python 月日年转年月日_在Python中将年/月/日转换为年份
  7. mac电脑抹掉数据要多久_Mac电脑如何恢复出厂设置?
  8. PO-01,cas:1258323-36-2乙酰丙酮酸二(4-苯基-噻吩[3,2-C]吡啶-C2,N)合铱(III)
  9. Pandas大量Excel数据写入Mysql
  10. JAVA房产置购门户网站计算机毕业设计Mybatis+系统+数据库+调试部署