【问题标题】:How do I find "Could not resolve placeholder" cause如何找到“无法解析占位符”的原因
【发布时间】:2014-01-30 18:45:26
【问题描述】:

我正在寻找一种方法,而不是一个答案。

我有一个现有的、正在工作的 Spring“服务器”项目,maven 目录结构,包括 JUnit 测试。我还有一个现有的“库”项目,与服务器项目不同的目录树,由服务器项目和其他服务器项目使用。

我正在尝试将一些类从服务器项目移动到库项目。我使用了 eclipse 的重构移动功能,因为它搜索 java 和 XML 文件,并且似乎在更改需要更改的内容方面做得很好。我把类移过来并纠正了编译错误。

但是,现在我在服务器项目中的 JUnit 测试失败了,我不知道为什么。这些错误都是“无法解析占位符”,并且引用了使用“@Value”注释的移动类中的字段,例如:

@Value("x.y.maxRetries")
private int allowedRetries;

这些值都不是新的——我根本没有更改这些类中的代码——所以配置确实有这些值。但它似乎告诉我它找不到它们。不同的名称(maxRetries v allowedRetries)是有意的,这就是它们在服务器项目中的工作方式。

如果我切换回移动这些之前的分支,一切都很好。分支之间的唯一区别是移动的 Java 文件的位置。

JUnit 测试不直接测试移动的类;移动的类仅间接使用。即,我们可能有一个“ProcessOne”类和一个“ProcessOneTest”类,两者都在服务器项目中,没有移动。我们在库中还有一个“SupportOne”类。在移动之前,JUnit ProcessOneTest 类工作正常;移动 SupportOne 后,JUnit 测试会抛出此错误。

JUnit 测试类有`@ContextConfiguration(locations = { "/spring/applicationContext-test.xml" })。我很想认为我可以以某种方式纠正那里的事情,但无论是什么目录,在我看来它应该是相对于服务器项目的,因此不应该改变。而且,其中的值也没有改变。

所以我不是在找人来告诉我这里出了什么问题。但如果有人有我可以通过的方法来解决它,我将不胜感激。

【问题讨论】:

  • 属性占位符(通常)从属性文件中解析。这些是你新项目的一部分吗?显然缺少了什么。
  • 我认为不会有任何“缺失”的东西本身。我没有任何新项目,我有一个之前存在的服务器项目和一个库项目,以及之前存在的@Value 注解,以及之前存在的属性文件。服务器和库都有 PropertyPlaceholderConfigurer bean,它们的“位置”属性设置为相同的两个值。

标签: java eclipse spring maven junit


【解决方案1】:

事实证明,通过删除服务器项目中 applicationContext-test.xml 文件的“扫描”部分,该问题已得到“修复”。事实证明不需要扫描,而且显然有一些组件曾经被扫描但现在没有引起某种问题。我们仍然不确定为什么会出现这个问题。

【讨论】:

    【解决方案2】:

    尝试在服务器和库目录中对“x.y.maxRetries”键进行全文搜索。您很可能只会在服务器项目中找到包含密钥的资源。

    服务器 bean 是否由与库 bean 不同的 Spring 上下文管理?如果是,则库上下文中的占位符配置器可能不会引用包含正确键的资源。

    【讨论】:

    • x.y.maxRetries 的唯一出现是在一个属性文件中;此文件在服务器和库项目中的 applicationContext-test.xml 中的“locations”属性下被引用。 'spring context' 是指 @ContextConfiguration 吗?它们是不同的文件,尽管它们都加载了包含我需要的值的相同属性文件。我不知道这是否仍然是问题......
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2021-06-23
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多