当前位置: 首页 > 知识库问答 >
问题:

覆盖默认数据源getConnection()

瞿博易
2023-03-14

我试图将Spring应用程序(大部分)转换为Spring Boot应用程序。在应用程序中,我有一个HTTP基本过滤器,收集用户名和密码,然后在DataSource实现中作为变量传递。

在这个数据源中,getConnection()方法是这样的:

@Override\n public Connection getConnection() throws SQLException {
Statement  stmt = null;

try {
    ConnectionWrapper connection = this.authenticatedConnection.get();
    if (connection == null) {
        connection = new ConnectionWrapper(this.dataSource.getConnection());

        StringBuilder command;

        // The CONNECT command allows indicating a user name, a password
        // and a database to initiate a
        // new session in the server with a new profile.
        command = new StringBuilder("CONNECT USER ").append(this.parameters.get().get(USER_NAME)).append(" PASSWORD ")
                .append("'").append(this.parameters.get().get(PASSWORD_NAME)).append("'").append(" DATABASE ")
                .append(this.parameters.get().get(DATA_BASE_NAME));

        this.authenticatedConnection.set(connection);

        stmt = connection.createStatement();
        stmt.execute(command.toString());
    }

    return connection;
} catch (final SQLException e) {...`

(由于StackOverflow格式问题,\n作为新行)

在Spring中,我可以毫无问题地实现@autowiledPrivate DataSource dataSource。据我所知,在Spring Boot中,对象需要是一个Bean才能使用@autowmed,但是当我在这个实现的DataSource之前添加@Bean时,我得到了“注释@Bean不允许用于这个位置”

我怎样才能得到它,这样我就可以做一个数据源了。getConnection();从主数据源获取连接,或者能够覆盖主数据源的方法?

在我看来,这里按优先顺序列出了4种可能的解决方案:

  1. 创建一个实际上正在覆盖spring的数据源。数据源的方法
  2. 让这个实现“Beanified”,这样我就可以再次@Autowired数据源了
  3. 我想我可以跳过@Autowired并简单地设置它。dataSource=[在application.properties中定义的spring.dataSource的未知引用]
  4. 创建另一个用spring配置的数据源类ProgrammedDataSource。数据源属性,然后将其设置为。dataSource=新编程的dataSource()

但是我试图实施这些解决方案中的任何一个都产生了这个问题。

共有1个答案

罗奇文
2023-03-14

我想出来了。我不需要在那里生成Bean,尽管我仍然不确定为什么我不能在数据源之前调用@Bean,但无论如何。

在我的申请中:

public class ServiceApplication {

@Bean
@Primary
@ConfigurationProperties("spring.datasource")
 public DataSource dataSource(){
  return DataSourceBuilder.create().build();
 }

@Bean(name="AuthDataSource")
public DataSource authDataSource() {
        return new AuthDataSource();
}

public static void main(String[] args) {
    SpringApplication.run(ServiceApplication.class, args);
}

}

在控制器里我有:

@Controller
@RequestMapping("/service")
public class ServiceController {

      @Autowired
      public void MyBean(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = new JdbcTemplate(new AuthDataSource());
      } ...

但是,由于我在JdbcTemboard中调用了新的AuthDataSource(),它没有执行自动连接。现在控制器看起来像这样,它的工作原理是:

@Controller
@RequestMapping("/service")
public class ServiceController {

      @Autowired
      @Qualifier("AuthDataSource")
      private DataSource datasource;
      private JdbcTemplate jdbcTemplate;

      @Autowired
      public void MyBean(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = new JdbcTemplate(this.dataSource);
      } ...
 类似资料:
  • 我使用默认构造函数从子类中设置recordId的值,最初没有使用lombok。最终我决定在这里使用构建器,但现在的问题是lombok构建器在内部覆盖了我的默认构建器,因此从未设置值。

  • 问题内容: 我已经能够覆盖所有名称以“ android:”为前缀的主题,但是Android themes.xml还定义了似乎无法被覆盖的属性。例如: colorTheground是在Theme.Light xml中定义的,但是在此处添加它可以使我 错误。如何为整个应用程序覆盖该样式? 问题答案: 您可以用修改属性(如)的方式覆盖标准属性,只是不要忘记添加如下前缀:

  • 问题内容: 我想覆盖Java外观。我只想显示不同的按钮。 我想要Windows Look and Feel的所有功能,但仅按钮有所不同。希望你明白我的意思。 还告诉我如何制作圆形的JtabbedPane ??? 问题答案: 自定义GUI类 调用您的自定义GUI类

  • 问题内容: 我有一个模板与此: Django自动将此翻译为Terminarsesión西班牙语。但是,我想将其翻译为Cerrarsesión。 我试图将此文字添加到.po文件中,但是在编译消息时出现错误,指出该文字重复。 有没有一种方法可以更改/覆盖默认的Django翻译? 谢谢。 问题答案: 最简单的方法是收集在django.contrib.admin语言环境文件夹中找到的.po文件,然后重新编

  • 我目前正在做一个项目,在这个项目中,我们有一个jenkins实例与一个单独的网站并排运行,工作流程是这样的,用户需要点击网站中的链接,从而触发jenkins实例中的jenkins作业。 触发的jenkins作业有几十个参数,我们目前正在做的是,该网站将使用javascript构建一个如下URL: https://JENKINS_HOST/作业/JOB_NAME/build with Paramet

  • 问题内容: 我有一个静态html,imgs,flash内容文件夹,它位于webapp文件夹之外。现在,我正在使用符号链接将该文件夹映射到我的webapp目录中。我的问题是,当我取消部署应用程序时,它会遵循符号链接并删除所有这些文件。 我尝试实现的解决方案之一是特殊的servlet,它包装了默认的servlet,但是使用了不同的相对路径。我在找出如何以覆盖默认servlet路径的方式包装默认serv