概述

我是否需要其他SOAP框架来运行Spring Web Services?
您不需要任何其他SOAP框架来使用Spring Web Services,尽管它可以使用Axis 1和2的一些功能。

[顶部]


我收到NAMESPACE_ERR使用Spring-WS时出现异常。我该怎么办?

如果您收到以下异常

NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
               

通常,此异常与使用旧版本的Xalan有关。请务必升级到2.7.0。

[顶部]

Java

Spring-WS是否在Java 1.3或1.4下运行?

从2.0版本开始,Spring Web Services需要Java 1.5或更高版本。

[顶部]


Spring-WS是否在Java 1.6下工作?

Java 1.6附带SAAJ 1.3、JAXB 2.0和JAXP 1.4(Xerces和Xalan的自定义版本)。通过将不同版本放在类路径上来覆盖这些库将导致各种类加载问题,或在org.apache.xml.serializer.ToXMLSAXHandler中出现异常。使用更新版本的唯一选项是将更新版本放入endorsed目录(参见上文)。

[顶部]

SAAJ

SAAJ是什么?

SAAJ是Java的带附件的SOAP API。像大多数Java EE库一样,它由一组接口(saaj-api.jar)和实现(saaj-impl.jar)组成。在应用程序服务器中运行时,实现通常由应用程序服务器提供。以前,SAAJ是JAXM的一部分,但它已作为Java Web Service Developer Pack的一部分作为一个单独的API发布,也作为J2EE 1.4的一部分发布。SAAJ通常被称为包javax.xml.soap.

Spring-WS使用此标准SAAJ库创建SOAP消息的表示。或者,它可以使用Apache AXIOM

[顶部]


我的应用程序服务器支持哪个版本的SAAJ?
应用程序服务器SAAJ版本
BEA WebLogic 81.1
BEA WebLogic 91.1/1.2*
BEA WebLogic 101.3**
IBM WebSphere 61.2
SUN Glassfish 11.3
JBoss 4.21.3***

* = 请参阅下文

** = 请参阅下文

*** = 请参阅下文

此外,Java SE 6包括SAAJ 1.3。

[顶部]


我收到一个NoSuchMethodError使用SAAJ时。我该怎么办?

如果您收到以下堆栈跟踪

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.ws.soap.saaj.SaajSoapMessageFactory' defined in ServletContext resource [/WEB-INF/springws-servlet.xml]:
Invocation of init method failed;
nested exception is java.lang.NoSuchMethodError:
javax.xml.soap.MessageFactory.newInstance(Ljava/lang/String;)Ljavax/xml/soap/MessageFactory;
Caused by:
java.lang.NoSuchMethodError:
javax.xml.soap.MessageFactory.newInstance(Ljava/lang/String;)Ljavax/xml/soap/MessageFactory;
               

像大多数J2EE库一样,SAAJ由两部分组成:由接口组成的API(saaj-api.jar)和实现(saaj-impl.jar)。堆栈跟踪是由于您正在使用新版本的API(SAAJ 1.3),而您的应用程序服务器提供了早期版本的实现(SAAJ 1.2甚至1.1)。Spring-WS支持SAAJ的所有三个版本(1.1到1.3),但当它看到1.3 API但没有1.3实现时,就会出现问题。

因此,解决方案非常简单:从类路径中删除较新的1.3版本API,并将其替换为您的应用程序服务器支持的版本。

[顶部]


我收到一个UnsupportedOperationException“此类不支持SAAJ 1.1”当我使用WebLogic 9下的SAAJ时。我该怎么办?

WebLogic 9在SAAJ 1.2实现中有一个已知错误:它实现了所有1.2接口,但在调用它们时会抛出UnsupportedOperationExceptions。令人困惑的是,异常消息是此类不支持SAAJ 1.1,尽管它完全支持SAAJ 1.1;它只是不支持SAAJ 1.2。另请参阅此BEA论坛帖子

Spring-WS对此有一个解决方法,我们基本上只在处理WebLogic 9时使用SAAJ 1.1。不幸的是,其他依赖SAAJ的框架(例如XWSS)没有此解决方法。这些框架乐于调用SAAJ 1.2方法,这会抛出此异常。

解决方案是不使用BEA的SAAJ版本,而是使用另一个实现,例如Axis 1或SUN的实现。在您的应用程序上下文中,使用以下内容

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="messageFactory">
        <bean class="com.sun.xml.messaging.saaj.soap.MessageFactoryImpl"/>
    </property>
</bean>
                   

[顶部]


我收到一个UnsupportedOperationException“此类不支持SAAJ 1.1”当我使用WebLogic 10下的SAAJ时。我该怎么办?

Weblogic 10附带两个SAAJ实现。默认使用有bug的9.x实现(位于包weblogic.webservice.core.soap中),但有一个新实现,支持SAAJ 1.3(位于包weblogic.xml.saaj中)。通过查看Spring Web Services启动时的DEBUG日志,您可以看到使用了哪个SAAJ实现。

要使用此新版本,您必须像这样创建消息工厂bean

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="messageFactory">
        <bean class="weblogic.xml.saaj.MessageFactoryImpl"/>
    </property>
</bean>
                   

[顶部]


我收到一个IndexOutOfBoundsException当我使用JBoss下的SAAJ时。我该怎么办?

JBoss提供的SAAJ实现存在一些问题。因此,解决方案是不使用JBoss实现,而是使用另一个实现。例如,您可以像这样使用SUN的参考实现

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="messageFactory">
        <bean class="com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"/>
    </property>
</bean>
                   

[顶部]


Spring-WS是否在IBM WebSphere上运行?

WebSphere捆绑了一些过时的库,需要用更新的版本升级。具体来说,这包括XML-apis、Xerces、Xalan和WSDL4J。

有几种方法可以升级这些库,所有方法都使用父优先或应用程序优先的类加载。

  • 将库打包为WAR的一部分(在WEB-INF/lib中),并使用父优先(应用程序优先)类加载运行Web应用程序。
  • 将库打包为EAR的一部分,将类路径条目添加到Web应用程序的清单中,并使用父优先类加载运行整个应用程序。
  • 在WebSphere控制台中创建新的类加载器,并将库与之关联。将此类加载器设置为父优先。
最后一种方法的优点是将父优先类加载限制为仅冲突的库,而不是整个应用程序。

[顶部]

WSDL

为什么Spring-WS只支持契约优先?

您可以在单独页面上找到此问题的答案。请注意,Spring-WS只要求您编写XSD;WSDL可以从中生成。教程说明了如何操作。

[顶部]


如何从服务中检索WSDL?&WSDL查询参数不起作用。

&WSDL查询参数是获取类WSDL的一种方式。在SWS中,服务通常不作为单个类实现,而是作为端点的集合实现。

有两种方式暴露WSDL

  • 只需将WSDL添加到WAR的根目录,文件就会正常提供。这有一个缺点,即WSDL中的“位置”属性是静态的,即它不一定反映服务器的主机名。您可以通过使用 WsdlDefinitionHandlerAdapter来转换位置。
  • 使用MessageDispatcherServlet,这在示例中已经完成。在*-servlet.xml中列出的每个WsdlDefinition都将以bean名称公开。因此,如果您定义一个*-servlet.xml命名为echo,它将作为echo.wsdl公开(即https://:8080/echo/echo.wsdl).

[顶部]


© . This site is unofficial and not affiliated with VMware.