【问题标题】:PropertyPlaceholderConfigurer works from Maven command line, but not from Eclipse?PropertyPlaceholderConfigurer 从 Maven 命令行工作,但不能从 Eclipse 工作?
【发布时间】:2011-03-02 00:06:34
【问题描述】:

我已将 Eclipse 配置为使用外部 maven 实例。尽管如此,我有一个从命令行运行良好的集成测试,但在 Eclipse 中却失败了。该错误是一个类 Spring 应用程序上下文 bean 错误:

Cannot convert value of type [java.lang.String] to required type

罪魁祸首是一个使用 PropertyPlaceholderConfigurer 设置属性值的 bean。

<!-- property settings for non-JNDI database connections -->
<bean id="placeholderConfigUuid" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="location" value="classpath:database.properties" />
    <property name="placeholderPrefix" value="$DS{" />
</bean>

我知道哪个 bean 失败了,因为它出现在堆栈跟踪中,并且当我将 $DS{hibernate.dialect} 替换为静态值时它可以工作。

编辑:这里是使用属性值的地方:

<bean id="myTestLocalEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myapp-core" />
    .......ommitted for brevity.......
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
            <!-- The following use the PropertyPlaceholderConfigurer but it doesn't work in Eclipse -->
            <property name="database" value="$DS{hibernate.database}" />
            <property name="databasePlatform" value="$DS{hibernate.dialect}" />
        </bean>
    </property>
</bean>

我有两个问题:

1) 由于 M2Eclipse 使用与命令行相同的 Maven 设置,为什么一个工作而另一个失败? 2)如何解决这个问题?我真的很喜欢在 Eclipse 中按需运行单个 jUnit 测试的能力。

【问题讨论】:

    标签: eclipse spring configuration maven-2 junit


    【解决方案1】:
    • 过滤是否适用于 Eclipse 下的“常规”单元测试?
    • m2eclipse 是否配置为处理资源并在资源更改时测试资源:

    alt text http://www.imagebanana.com/img/rwd919ek/screenshot_008.png

    • 您的集成测试有什么需要特别提及的吗(从 Maven 的角度来看)?

    【讨论】:

    • 是的——常规的 Maven 过滤在 Eclipse 下工作(这将是我的临时解决方法)。我的 m2Eclipse 项目设置与您的屏幕截图完全相同,只是我没有 WTP 配置器。我有这个项目的另一个模块,它使用 PPC 并且它可以工作,所以它一定是关于这个模块的。另外,我为 ignoreUnresolvablePlaceholders 使用默认值 false,所以你会认为 PPC 会抛出异常,而不是返回错误的字符串。
    • @HDave 实际上,这看起来更像是“春季问题”而不是 Maven 问题。我真的很想知道集成测试有什么“特别”之处。如果您在运行测试之前从 Eclipse 运行 Maven 构建,结果会有所不同吗?
    • 经过数小时的研究和调试,这是我发现的。 Maven 过滤适用于我的 applicationContext.xml 文件,因为它是一个测试资源。 Maven 过滤在 database.properties 上被破坏(我认为),因为它是一个“资源”。因此,罪魁祸首不是 PPC,而是 m2eclip,而且由于某种未知原因,它没有像命令行那样过滤我的常规资源。但如何/为什么会有所不同?
    • 经过更多小时的研究,我确定当您在 Eclipse 中选择 Junit 调试或运行配置时,它似乎与 m2eclipse 几乎没有关系。缺少类,没有复制资源等。它可靠工作的唯一方法是首先进行完整的“mvn verify”(或测试/安装)。然后它似乎工作正常。
    【解决方案2】:

    您正在使用 M2Eclipse(最新版本?)您在 Eclipse 中使用 Maven 3,但我假设您在命令行上使用 Maven 2(2.2.1?)...另一方面,您是说您的“集成测试”正在命令行上运行(构建环境等),但您想从 Eclipse 中运行“单元测试”......单元测试与集成测试不同......我'我并不惊讶您的集成测试在 Eclipse 中不起作用...如果我们看到使用的 POM 和代码,我们可以说更多吗?

    【讨论】:

    • 是的——我使用的是 Maven 2 (2.2.1)。该测试是真正的“集成”测试。我在 Eclipse 中运行它时称它为“单元”测试,只是因为这是 Eclipses 使用的唯一术语(它没有区别)。 “惊讶”是一个很好的词。看到工具以这种方式运行是非常令人不安的。如果我不能信任 Eclipse 和 Maven 命令行,那就太糟糕了。
    最近更新 更多