java.lang.RuntimeException:在Glassfish上部署时无法创建安全的XMLInputFactory

时间:2014-11-20 08:52:35

标签: java maven glassfish cxf

我有一个使用CXF 2.7.13开发的Web服务应用程序。当我在我的本地Tomcat实例上部署时,一切正常,但是当切换到glassfish 4实例时,我得到以下异常:

java.lang.RuntimeException: Cannot create a secure XMLInputFactory
    at org.apache.cxf.staxutils.StaxUtils.createXMLInputFactory(StaxUtils.java:315)
    at org.apache.cxf.staxutils.StaxUtils.getXMLInputFactory(StaxUtils.java:265)
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1701)
    at org.apache.cxf.interceptor.StaxInInterceptor.handleMessage(StaxInInterceptor.java:123)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:241)
    at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
    at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
    at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:722)]]

从我所读到的,似乎来自CXF的Woodstox api(woodstox-core-asl.jar)依赖与glassfish自己的库版本相冲突。 CXF使用Woodstox 4.4.1而我的glassfish 4实例使用了4.1.2。

所以我的第一次尝试是尝试排除CXF的依赖关系,并在我的POM上声明我自己的Woodstox 4.1.2依赖关系,以便每个人都使用相同的版本。但这并没有解决问题。

我还尝试直接从我的POM中删除此依赖项,并在部署之前检查它是否未包含在WAR中,也无效(相同的例外)。

我只是通过从服务器的模块目录中删除.jar来设法在glassfish上部署,但这是我在生产服务器上根据要求无法做到的。

还有什么我可以尝试的吗?

3 个答案:

答案 0 :(得分:2)

这很容易,我很惭愧我花了5个小时尝试用maven解决它在官方文档页面上http://cxf.apache.org/docs/application-server-specific-configuration-guide.html):

  如果没有这个sun-web.xml,

CXF拦截器将无法在Glassfish中运行   用于配置类加载器的文件。默认情况下,Glassfish将使用   用于JAX-WS服务的Metro,因此需要将类加载器配置为   允许CXF库提供JAX-WS服务。下列   sun-web.xml xml源已添加到/ WEB-INF以解决此问题:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sun-web-app PUBLIC
'-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet
 2.5//EN' 'http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd>
 <sun-web-app> <class-loader delegate="false"/> </sun-web-app>

答案 1 :(得分:2)

我面临着同样的问题,但是将其部署到网络领域,经过几个小时的研究,找出了woodstox的确切版本,即下面

<dependency>
    <groupId>org.codehaus.woodstox</groupId>
    <artifactId>woodstox-core-asl</artifactId>
    <version>4.2.0</version>
</dependency>

https://bugs.eclipse.org/bugs/show_bug.cgi?id=409070链接也有助于解决问题。

答案 2 :(得分:1)

请优先实施kelmers answer以免打开安全漏洞!

根据应用程序的安全要求,您可以使用org.apache.cxf.stax.allowInsecureParser选项。

来自documentation

  

有一个&#34; org.apache.cxf.stax.allowInsecureParser&#34;系统属性   可以设置为true以允许使用不安全的解析器,但也就是说   强烈不推荐

但我认为您最好咨询glassfish文档,了解如何覆盖/排除特定部署的系统库。