1

Spring-namespaces允许您定义自己的结构如何配置 spring bean。很酷。

我必须使用第 3 方软件(Assentis Docbase),它在其 spring.schemas 中定义了以下内容(下面的示例简化)

http\://com.apress.prospring2/ch07/custom.xsd=custDir:/custom.xsd

含义:如果用户在其 spring-xml 中定义 schema-location: "http://com.apress.prospring2/ch07/custom.xsd" spring 将根据 custom.xsd 验证此文件。

custDir 是提供的 jar 之外的目录。有谁知道如何在junit测试期间将此custDir设置为指向有效路径?我已经尝试过 -DcustDir=/pathToXsd/ 但它不起作用。

如果我删除 custDir,一切都按预期工作,但我无法从提供的 spring.schemas 中删除它,因为它是第 3 方软件。

也许这是如何在 java 中处理属性文件的问题,但我不知道。

4

2 回答 2

0

您可以通过为您自己的自定义 spring.schemas 文件提供相同的条目但具有自定义 xsd 文件的位置来“覆盖”此条目。问题是这高度依赖于 spring.schemas 加载的顺序,但值得一试。

由于 custDir 不是占位符,因此您无法按照您的方式替换它,我很惊讶第三方模式位置位于类路径之外。

于 2012-07-06T11:47:45.007 回答
0

我在问题中提供的语法spring.schemas是 3.rd 方软件的专有定义。他们在那里实现了自己的EntityResolver手动反应"custDir:"并启动了一些魔术算法。所以我来到了以下解决方法。

您必须创建自己的my_spring.schemas必须居住在META-INF/. 比你必须确保弹簧负载my_spring.schemas而不是spring.schemas

我通过实现我自己的实现了它,TestingContext它是ClassPathXmlApplicationContext. 在TestingContext我覆盖了方法protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException并用org.springframework.context.support.AbstractXmlApplicationContext. 我所做的唯一更改是行beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this))beanDefinitionReader.setEntityResolver(new PluggableSchemaResolver(getClassLoader(), "META-INF/my_spring.schemas). 瞧,如果我使用TestingContext自己的my_spring.schemas已加载。

此解决方案的缺点是您必须在 jar 中提供所有 xsd,因为 spring 查找定义的默认名称已更改。

于 2012-07-09T11:48:45.913 回答