0

我试图在 Citrus 中设置一个XsdSchemaRepository包含一些 XML 模式的内容。因为这些模式没有目标命名空间(它们不是我的,我无法解决这个问题),所以我还配置了一个RootQNameSchemaMappingStrategy,因为映射命名空间的默认策略显然不起作用。

但是,由于 Spring 类中的以下异常,我失败了:

Caused by: java.lang.IllegalArgumentException: class path resource [path to my schema file] has no targetNamespace
    at org.springframework.util.Assert.hasText(Assert.java:181)
    at org.springframework.xml.xsd.SimpleXsdSchema.loadSchema(SimpleXsdSchema.java:128)
    at org.springframework.xml.xsd.SimpleXsdSchema.afterPropertiesSet(SimpleXsdSchema.java:117)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)

如果模式没有目标命名空间,是否可以使用 Citrus 进行 XML 模式验证?

4

1 回答 1

0

目标命名空间限制来自 Spring 的 SimpleXsdSchema 实现。您可以实现自己的子类,该子类提供默认命名空间:

public class NoTargetNamespaceXsdSchema extends SimpleXsdSchema {

    @Override
    public String getTargetNamespace() {
        return Optional.ofNullable(super.getTargetNamespace())
                       .orElse("urn:uuid:" + UUID.randomUUID());
    }
}

您可以将自定义实现添加到 Citrus 模式存储库作为 Spring bean 参考:

<bean id="noTargetNamespaceXsdSchema" class="com.consol.citrus.xml.schema.NoTargetNamespaceXsdSchema">
  <property name="xsd" value="path/to/sample.xsd"/>
</bean>

<citrus:schema-repository id="schemaRepository">
  <citrus:schemas>
    <citrus:reference schema="noTargetNamespaceXsdSchema"/>
  </citrus:schemas>
</citrus:schema-repository>
于 2018-01-26T12:04:18.497 回答