使用Spring和OAS / OC4J的Java Web服务

时间:2009-01-23 14:03:18

标签: java web-services oc4j

我在向OC4J部署简单的WebServices应用程序(如“Hello World”简单)时遇到问题。相同的代码在Jetty下工作正常,但在OC4J中断,我想知道是否有其他人遇到过同样的问题。我正在使用Enterprise Manager来部署应用程序,但部署失败并显示以下消息:

    [Jan 23, 2009 8:46:20 AM] Binding TestWs web-module for application TestWs to site default-web-site under context root /TestWs 
    [Jan 23, 2009 8:46:22 AM] Operation failed with error: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws] 
Offending resource: ServletContext resource [/WEB-INF/beans.xml] 

查看beans.xml,有问题的代码似乎是XML名称空间声明:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <jaxws:endpoint
        id="helloService"
        implementor="com.test.endpoint.HelloImpl"
        address="/HelloWorld" />
</beans>

堆栈跟踪不是很明显:

    09/01/23 08:57:28 oracle.oc4j.admin.internal.DeployerException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws]
    Offending resource: ServletContext resource [/WEB-INF/beans.xml]

    09/01/23 08:57:28   at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    09/01/23 08:57:28   at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    09/01/23 08:57:28   at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80)
    09/01/23 08:57:28   at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:261)
    09/01/23 08:57:28   at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1120)
...

有没有其他人遇到过类似的问题?如果是这样,那么修复它的最佳方法是什么?我的XML技能中等,我是WebServices的完全菜鸟。但这可能是OC4J问题。

提前感谢您的帮助!

编辑:据我所知,这不是一个类路径问题,除非OC4J对于想要看到哪些罐子而言很奇怪(我知道Tomcat可以)。我的WEB-INF / lib文件夹包含CXF jar,Spring jar(bean,context,core和web),xml-resolver-1.2.jar和XmlSchema-1.4.2.jar。如果我需要列出WEB-INF / lib文件夹中的所有内容,我会的。但同样,该计划在Jetty工作。

另一个编辑:根据我正在阅读的内容here,这似乎是Spring和CXF jar之间的一个问题 - 在CXF jar中有一个NamespaceHandler类(在确切地说org.apache.cxf.frontend.spring,但似乎存在阻止Spring看到它的配置问题。

最后修改:感谢大家的帮助。我从来没有让CXF在OC4J中工作,因为我的客户端是在10.1.3.3.0版本上。它不符合J2EE 5,我很确定他们不会去解压缩他们的oc4j.jar以更改boot.xml。但是如果没有丹尼尔指出的文件,我就不会知道。

所以我切换到XFire版本1.2.6,并在几次打嗝之后让我的测试应用程序正常工作。在此过程中,我学到了一些有关OC4J的有趣内容:

  • 在企业管理器中部署时,请确保先选择加载本地类路径。
  • OC4J使用非标准XML文件,因此请确保您的应用未使用任何OC4J的原生XML文件(在部署设置中,取消选中所有当前选定的导入 - 这样,您可以确保该应用正在使用只有您在WEB-INF / lib中提供的文件)
  • 如果可以,请使用其他应用服务器。 :P

再次感谢大家!

3 个答案:

答案 0 :(得分:2)

我讨厌问这个显而易见的问题,但是你有没有看过从CXF网站上配置OS4J和CXF的所有内容? http://cwiki.apache.org/CXF20DOC/appserverguide.html#AppServerGuide-OC4J

答案 1 :(得分:1)

我认为这是一个CLASSPATH问题。

我对OC4J并不熟悉,但您如何打包/部署您的网络应用程序?

您需要确保CXF jar位于WAR的WEB-INF/lib目录中吗?

更新:您的评论有点困惑 - 如果您的弹簧配置位于EAR的META-INF目录中,那么这与您的网络应用程序使用的类路径不同。所以,事实上,在WEB-INF/lib中坚持使用CXF jar是行不通的。您需要将JAR放在EAR的顶层,或者在OC4J的所有类加载器共享的某些库中。我建议研究OC4J的enterprise-app / web-app类加载器层次结构文档,看看这是否可以提供更多建议?

答案 2 :(得分:1)

看起来像Spring的配置问题:

Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws]
Offending resource: ServletContext resource [/WEB-INF/beans.xml]

您的web.xml中有什么内容可以在应用启动时阅读吗?您是否在代码中的任何位置看到为该命名空间声明了NamespaceHandler?