我尝试使用 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(来源未知)
我搜索了现有问题,并在一年前活跃的问题中发现了相同的异常旧问题链接。根据我的解决方案
以下是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>
有什么想法为什么我仍然会遇到例外吗?
我在 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 中的现有文件合并。
祝你好运,或者反馈发现其他问题。