Raml 验证器在 javax.xml.validation.SchemaFactory.newSchema 中引发错误

Posted

技术标签:

【中文标题】Raml 验证器在 javax.xml.validation.SchemaFactory.newSchema 中引发错误【英文标题】:Raml validator throws an error in javax.xml.validation.SchemaFactory.newSchema 【发布时间】:2015-12-10 19:07:12 【问题描述】:

在尝试验证 espn.raml 时出现以下错误。对于gmail.raml,相同的代码运行良好。为什么会这样? 供您参考,我已经包含了我发现 SchemaFactory 包含的 jar 的结果。

$ 查找 *.jar | xargs grep SchemaFactory.class 二进制文件

axiom_1.2.11.wso2v6.jar 匹配二进制文件

org.apache.openjpa_2.2.0.wso2v1.jar 匹配二进制文件

solr_5.2.1.wso2v1.jar 匹配

这是我得到的例外:

Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "javax.xml.validation.SchemaFactory.newSchema(Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;" the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) of the current class, org/raml/parser/rule/SchemaRule, and the class loader (instance of <bootloader>) for resolved class, javax/xml/validation/SchemaFactory, have different Class objects for the type m/Source;)Ljavax/xml/validation/Schema; used in the signature
    at org.raml.parser.rule.SchemaRule.doValidateValue(SchemaRule.java:118)
    at org.raml.parser.rule.SchemaRule.doValidateValue(SchemaRule.java:48)
    at org.raml.parser.rule.DefaultTupleRule.validateValue(DefaultTupleRule.java:108)
    at org.raml.parser.visitor.YamlDocumentValidator.onScalar(YamlDocumentValidator.java:115)
    at org.raml.parser.visitor.NodeVisitor.visitScalar(NodeVisitor.java:256)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:222)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitMappingNode(NodeVisitor.java:86)
    at org.raml.parser.visitor.NodeVisitor.visit(NodeVisitor.java:218)
    at org.raml.parser.visitor.NodeVisitor.visitResolvedNode(NodeVisitor.java:180)
    at org.raml.parser.visitor.NodeVisitor.doVisitMappingNode(NodeVisitor.java:151)
    at org.raml.parser.visitor.NodeVisitor.visitDocument(NodeVisitor.java:209)
    at org.raml.parser.visitor.YamlValidationService.validate(YamlValidationService.java:65)
    at org.raml.parser.visitor.YamlValidationService.validate(YamlValidationService.java:95)
    at org.raml.parser.visitor.YamlValidationService.validate(YamlValidationService.java:82)
    at org.raml.parser.visitor.YamlValidationService.validate(YamlValidationService.java:72)
    at org.wso2.carbon.registry.custom.extensions.handlers.utils.RAMLProcessor.isValidateRAML(RAMLProcessor.java:127)
    at org.wso2.carbon.registry.custom.extensions.handlers.utils.RAMLProcessor.processRAML(RAMLProcessor.java:79)
    at org.wso2.carbon.registry.custom.extensions.handlers.RAMLMediaTypeHandler.put(RAMLMediaTypeHandler.java:157)
    at org.wso2.carbon.registry.core.jdbc.handlers.HandlerManager.put(HandlerManager.java:2503)
    ... 78 more

【问题讨论】:

【参考方案1】:

这很奇怪。我运行以下命令没有问题:

RamlValidationService
  .createDefault()
  .validate("http://api.apihub.com/onpositive/api/espn-raml-api/espn.raml");

它不会抛出异常并返回一个空的List&lt;ValidationResult&gt;,因为这个 RAML 文件是有效的。

我的环境:

Apache Maven 3.3.3
Java version: 1.8.0_60, vendor: Oracle Corporation

在我的例子中,javax.xml.validation.SchemaFactory 由 JDK 本身提供。您应该努力做到这一点,即确保没有其他库可以将此类贡献给您的代码,或者通过使用不包含此类的备用 JAR(这些似乎是 WSO2 特定版本,其他版本可能不同?)或者通过使用类加载器过滤,如果执行环境允许的话。

EDIT 正如在 cmets 中添加的那样,修复是从 RAML 解析器中排除 xml-apis:xml-apis。这种排除是有道理的,因为最近的 JDK 提供了 RAML Parser 所需的内容。

【讨论】:

【参考方案2】:

从 raml-parser 中排除 xml-apis 完成了这项工作。

<exclusion>
 <groupId>xml-apis</groupId>
 <artifactId>xml-apis</artifactId>
</exclusion>

现在验证没有问题。

【讨论】:

很酷,但这不是人们回答你的好动机。我的回答是指向这一点,但是根据您提供的信息,不可能看到 xml-apis 在类路径上。您本可以评论我的回答,让我使用此信息对其进行审核,然后接受它。 是的,先生,我知道您的回答向我展示了要看的地方。非常感谢你,继续努力。

以上是关于Raml 验证器在 javax.xml.validation.SchemaFactory.newSchema 中引发错误的主要内容,如果未能解决你的问题,请参考以下文章

在 RAML 中验证查询参数

RAML 文件的验证

Osprey RAML 验证错误处理

将 Swagger JSON 转换为 RAML/YAML

获取 java.lang.NoSuchFieldError: RamlValidationService 中的值

RAML 有 Eclipse 插件吗? [关闭]