gpt4 book ai didi

java - CXF:使用 JAR 文件中的 XSD 并使用相对导入进行架构验证

转载 作者:太空宇宙 更新时间:2023-11-04 10:10:18 25 4
gpt4 key购买 nike

我正在使用 CXF 提供基于 WSDL 的 Web 服务。CxfServlet 在嵌入式 Tomcat 中运行,我的 wsdl 和 xsd 文件位于类路径中的 JAR 中。

XSD 文件中的导入使用相对路径,例如./../../some.xsd

Web 服务已部署并正常工作。

但是,如果我尝试启用架构验证,则会出现以下异常:

java.lang.IllegalArgumentException: The resource path [/./../../some.xsd] has been normalized to [null] which is not valid
at org.apache.catalina.webresources.StandardRoot.validate(StandardRoot.java:265)
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:212)
at org.apache.catalina.webresources.StandardRoot.getResource(StandardRoot.java:206)
at org.apache.catalina.core.ApplicationContext.getResource(ApplicationContext.java:529)
at org.apache.catalina.core.ApplicationContextFacade.getResource(ApplicationContextFacade.java:201)
at org.apache.cxf.transport.servlet.ServletContextResourceResolver.resolve(ServletContextResourceResolver.java:82)
at org.apache.cxf.resource.DefaultResourceManager.findResource(DefaultResourceManager.java:120)
at org.apache.cxf.resource.DefaultResourceManager.resolveResource(DefaultResourceManager.java:58)
at org.apache.cxf.ws.addressing.EndpointReferenceUtils$SchemaLSResourceResolver.resolveResource(EndpointReferenceUtils.java:150)
at com.sun.org.apache.xerces.internal.util.DOMEntityResolverWrapper.resolveEntity(DOMEntityResolverWrapper.java:117)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.resolveEntity(XMLEntityManager.java:1081)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.resolveDocument(XMLSchemaLoader.java:654)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.resolveSchema(XSDHandler.java:2058)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.constructTrees(XSDHandler.java:1014)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.constructTrees(XSDHandler.java:1126)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.constructTrees(XSDHandler.java:1126)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.constructTrees(XSDHandler.java:1126)
at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:625)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:610)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:569)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadGrammar(XMLSchemaLoader.java:535)
at com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory.newSchema(XMLSchemaFactory.java:254)
at org.apache.cxf.ws.addressing.EndpointReferenceUtils.createSchema(EndpointReferenceUtils.java:622)
at org.apache.cxf.ws.addressing.EndpointReferenceUtils.getSchema(EndpointReferenceUtils.java:668)
at org.apache.cxf.interceptor.AbstractInDatabindingInterceptor.setDataReaderValidation(AbstractInDatabindingInterceptor.java:116)
at org.apache.cxf.interceptor.AbstractInDatabindingInterceptor.getDataReader(AbstractInDatabindingInterceptor.java:90)
at org.apache.cxf.interceptor.AbstractInDatabindingInterceptor.getDataReader(AbstractInDatabindingInterceptor.java:95)
at org.apache.cxf.wsdl.interceptors.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:92)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:216)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:301)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:220)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
...

我调试了 CXF 代码并得到以下发现:

  1. DefaultResourceManagerServletContextResourceResolver 作为顶部条目,已由 CXFNonSpringServlet 添加。
  2. ServletContextResourceResolver 使用 Catalina ApplicationContext.getResource(String path) 方法,该方法又要求 path/ 开头。它添加了这个斜杠并在 StandardRoot.validate() 中抛出上面列出的异常。
  3. 此异常传递到 DefaultResourceManager 并被 EndpointReferenceUtils.createSchema() 方法捕获。 IE。 DefaultResourceManager 中列出的其他 ResourceResolver 对象(尤其是 ClasspathResolver)均不用于从类路径加载 XSD。

如何才能运行 XSD 验证?有什么办法可以改变 ResourceResolver 的顺序吗?

已编辑

  • EndpointReferenceUtils.SchemaLSResourceResolver 类可以很好地解析 URL(即 newId 包含相关 XSD 文件所需的 URL)。但是,它不会使用它,因为它不会捕获 ResourceManager 抛出的异常。
  • 我不想使用绝对路径来解决解析器错误。从我的角度来看,如果 ServletContextResourceResolver 无法解析 XSD 并且不应该抛出异常,它应该返回 null

最佳答案

对于其他可能陷入此问题的人:我能够遵循@Joem 的分析,更进一步并设法在 CXF 方面修复此问题。它应该从 CXF 3.3.3 开始工作(在撰写本文时尚未发布)。

参见:https://issues.apache.org/jira/browse/CXF-8041

关于java - CXF:使用 JAR 文件中的 XSD 并使用相对导入进行架构验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52444801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com