1

我有一个在本地 tomcat 等上运行良好的 Spring MVC 应用程序。它是一个 Spring 3.1 MVC/Hibernate 应用程序。

我正在(在可能的情况下)为应用程序使用纯 Java @Configuration - 我现在正在尝试将应用程序部署到 CloudFoundry(通过 STS),但我正在努力配置 MySql 数据库(从内存中,使用 xml 配置你不需要做任何事情,Spring/CloudFoundry 会自动注入所需的用户/密码等,但是自从我将任何东西部署到 CF 以来已经有一段时间了)。

我尝试了以下两种配置:

@Bean
public BasicDataSource dataSource() throws PropertyVetoException {
    //CloudFoundry config
    final CloudEnvironment cloudEnvironment = new CloudEnvironment();
        final List<MysqlServiceInfo> mysqlServices = cloudEnvironment.getServiceInfos(MysqlServiceInfo.class);
        final MysqlServiceInfo serviceInfo = mysqlServices.get(0);

    BasicDataSource bean = new BasicDataSource();
    bean.setDriverClassName("com.mysql.jdbc.Driver");
    bean.setUrl(serviceInfo.getUrl());
    bean.setUsername(serviceInfo.getUserName());
    bean.setPassword(serviceInfo.getPassword());
    return bean;
}

以上在.get(0)mysqlServices 行越界失败。这是基于此处建议的答案。

我还尝试将数据源保留为它在本地运行的内容,以查看属性是否刚刚被注入,但那里也没有运气。(根据此处的 Spring 示例代码尝试了以下值,并且还使用了我的 db.connection 道具文件中的属性占位符)

@Bean
public BasicDataSource dataSource() throws PropertyVetoException {
    BasicDataSource bean = new BasicDataSource();
    bean.setDriverClassName("com.mysql.jdbc.Driver");
    bean.setUrl("");
    bean.setUsername("spring");
    bean.setPassword("spring");
    return bean;
}

编辑

我还使用了 getServiceInfo(String, Class) 方法,传入了我创建并绑定到应用程序的 MySql 服务的名称,但这只是类似于 getServiceInfos(..) 方法的 NPE

4

1 回答 1

1

好吧,这只是一个愚蠢的错误——当我通过 STS 部署应用程序时,我选择了 Java Web 应用程序而不是“Spring”类型。不知道为什么这会使 CloudEnvironment 属性不可用(我的印象是该方法是在非 Spring 应用程序中注入详细信息的常用方法) - 但将其作为 Spring 应用程序重新部署到服务器解决了问题!

于 2013-04-01T19:35:08.573 回答