尝试使用 JAXWS 将简单的 Web 服务绑定到 Spring bean,并且在我的应用程序上下文 xml 中读取 XSD 时出现错误

问题描述 投票:0回答:1

我尝试使用 JDK 1.7 绑定在 IBM WAS Liberty 8.5.5.4 上部署的已正常运行的 JAXWS Web 服务,但在根据 applicationContext.xml 绑定服务时出现以下错误。这是一个简单的Web应用程序,除了Web服务之外没有其他任何东西,Spring版本是4.1.0

schema_reference.4:无法读取模式文档“http://jax-ws.java.net/spring/servlet.xsd”,因为1)找不到该文档; 2)文档无法读取; 3)文档的根元素不是

<xsd:schema>

[错误]上下文初始化失败 ServletContext 资源 [/META-INF/applicationContext.xml] 中的 XML 文档中的第 30 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号:30;列数:30; cvc-complex-type.2.4.c:匹配通配符严格,但找不到元素 'wss:binding' 的声明。

[错误] SRVE0283E:初始化上下文时捕获异常:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:ServletContext 资源 [/META-INF/applicationContext.xml] 中的 XML 文档中的第 30 行无效;嵌套异常是 org.xml.sax.SAXParseException;行号:30;列数:30; cvc-complex-type.2.4.c:匹配通配符严格,但找不到元素“wss:binding”的声明。 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398)

引起:org.xml.sax.SAXParseException;行号:30;列数:30; cvc-complex-type.2.4.c:匹配通配符严格,但找不到元素“wss:binding”的声明。 在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(来源未知)

我搜索了现有问题,并在一年前活跃的问题中发现了相同的异常旧问题链接。根据我的解决方案

  1. 类路径中的 jaxws-rt.jar 版本 2.2.7 - applicationContext.xml 确实找到它并在编译时解析绑定标记,但在运行时出现问题
  2. 我已经更新了问题中提到的 xsd 位置,并验证了 xsd 确实存在于 http://jax-ws.java.net/spring/servlet.xsd

以下是applicationContext.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ws="http://jax-ws.dev.java.net/spring/core"
xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"    

xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://jax-ws.dev.java.net/spring/core http://jax-ws.java.net/spring/core.xsd 
http://jax-ws.dev.java.net/spring/servlet http://jax-ws.java.net/spring/servlet.xsd">

<bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="cache" value="false" />
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
<bean id="mathService" class="com.adp.sbs.jaxws.service.MathServiceImpl" />

<wss:binding url="/math">
<wss:service>
    <ws:service bean="#mathService" />
</wss:service>

</beans>

有什么想法为什么我仍然会遇到例外吗?

spring xsd jax-ws websphere-liberty
1个回答
0
投票

我在 WAS 6 上遇到了类似的问题,WAS 找不到位于其他 Jars 中的资源。就我而言,它找不到 spring-integration 的 spring-namespacehandlers (位于 META-INF/spring...),但 spring 本身可以工作。所以我的问题和你的类似:)

我将所有 Spring 类的 WAS 都设置为调试级别,这导致输出非常长。但我可以发现,没有 BeanConfigurator 找不到处理程序文件来处理 spring-integration-xsd。

但是 spring 是如何启动你的应用程序上下文的呢? (背景资料)

基本的 spring.jar 不包含创建上下文的所有解析器。它正在检查上下文定义(例如 xmlns:ws="http://jax-ws.dev.java.net/spring/core")并尝试为其找到解析器。因此,它会检查所有 jar 是否包含 /META-INF/spring.handler 和 META-INF/spring.schemas。 spring.handler 包含 NamespaceHandler 接口的实现路径。这些类负责重定向到特定的 AbstractBeanDefinitionParser。另一个类包含 xsd-names 的别名。

我可以在不了解更多有关您的应用程序的情况下想到 2 种可能的解决方案:

首先,jax-ws不包含那些spring.handler文件,加上namespaceHandler的必要实现。因此,您需要一个第三方 jax-ws-spring.jar,其中包含这些类。 我无法判断这是否符合您的问题,因为您没有附加依赖项。

第二个解决方案是从 jar 中提取文件(spring.handler 或 xsd)并将它们添加到您的应用程序中。幸运的是,您不需要在每次构建后手动执行此操作,有一个 Maven 插件。

<plugin>

  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>extract-jaxws-stuff</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>jax-ws-groupid</groupId>
            <artifactId>jax-ws-artifactId</artifactId>
            <version>${jax-ws.version}</version>
            <outputDirectory>src/main/resources</outputDirectory>
            <includes>path/to/the/resource</includes>
          </artifactItem>
        </artifactItems>
      </configuration>
    </execution>
  </executions>
</plugin>

更新:

打开 jaxws-spring.jar 并在 META-INF 文件夹中找到 spring.handlers 和 spring.schemas 文件。复制应用程序 META-INF 文件夹中的文件。
如果这也不起作用: 将 spring.handlers 和 spring.schemas 文件与 spring-context.jar 中的现有文件合并。

祝你好运,或者反馈发现其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.