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

如何使用Scala将ConfigurationProperties注入s配置类

易修洁
2023-03-14

在用Scala编写spring boot应用程序时,我遇到了一个问题,即如何将ConfigurationProperties注入s配置类。

我尝试了如下代码:

@Configuration
class Config @Autowired() (var properties: MessagePathProperties)

但发生了一个例外:

Caused by: java.lang.NoSuchMethodException: configuration.Config$$EnhancerBySpringCGLIB$$c8875845.<init>()

我还尝试了以下代码

@Configuration
class Config {
     @Autowired private var properties: MessagePathProperties = _
    ...
}

应用程序本身启动正常,但我发现Config中的属性为null。

同时,我尝试在服务类中注入属性,如:

@Service
class MessageService @Autowired() (var properties: MessagePathProperties)

并且属性在MessageService类中正常工作。

所以,我不知道@Configuration和@Service之间有什么区别,从而产生不同的效果。

顺便说一句,以下是我的应用程序类作为参考:

@SpringBootApplication
@EnableAutoConfiguration
@EnableConfigurationProperties
class ScalaServiceApplication

object Launch extends App {
  SpringApplication.run(classOf[ScalaServiceApplication], args :_ *)
}

共有2个答案

孟翰海
2023-03-14

我找到了案件的原因以及最终如何解决它。

实际上,我还在Config类中创建了一个propertysourcesplaceconfigurerbean,但控制台上有一条警告消息

@Bean method Config.propertySourcesPlaceholderConfigurer is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.

因此,我只是将该方法移动到scala对象中,如:

object Config {
  @Bean def propertySourcesPlaceholderConfigurer: PropertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer
}

因此,一切正常。

孙永嘉
2023-03-14

建议您使用Spring的隐式参数insead。

建议您使用implicits insead假设您需要将记录器注入worker,并且可能有不同类型的记录器:

case class Worker(in: String)(implicit logger: Logger) {
  def work(): Unit = {
    logger.log(s"working on $in")
    // doing some work here
  }
}

trait Logger {
  def log(message: String)
}

case class ConsoleLogger() extends Logger {
  override def log(message: String): Unit = {
    // just prints the message
    println(message)
  }
}

object MyApp extends App {
  implicit val logger: Logger = ConsoleLogger()
  // logger in current scope (ConsoleLogger) would be injected into worker
  val worker = Worker("some work")
  worker.work()
}
 类似资料:
  • 问题内容: 我有一堆Spring bean,它们是通过注释从类路径中拾取的,例如 我想将app.properites的属性之一注入到上面显示的bean中。我不能简单地做这样的事情 因为PersonDaoImpl在Spring XML文件中没有功能(它是通过注释从类路径中拾取的)。我有以下内容: 但是我不清楚我如何从中访问我感兴趣的财产? 问题答案: 你可以在Spring 3中使用EL支持进行此操作

  • 使用play 2.5和guice,我成功地将Application ationConfig注入到一个单例类中,并引用其中的一个配置变量, 然后,我可以将这个单例传递给这样一个存储库类 这一切工作正常,正如预期的那样,但问题是我需要在测试套件中调用这个存储库,所以我不希望它必须接受任何参数(特别是注入的参数)。所以我试着把它改成在体内用注射器 这让人感觉它应该可以工作,并且编译得很好,但在测试或运行

  • 问题内容: 我有一堆Spring bean,它们是通过注释从类路径中拾取的,例如 在Spring XML文件中,定义了一个PropertyPlaceholderConfigurer: 我想将app.properites的属性之一注入到上面显示的bean中。我不能简单地做这样的事情 因为PersonDaoImpl在Spring XML文件中没有功能(它是通过注释从类路径中拾取的)。我有以下内容: 但

  • 我正在学习SpringBoot,在参考文档中有一个例子,我有一个问题。文件的以下部分提到 6.使用@SpringBootApplication注释 可以使用单个@SpringBootApplication注释来启用这三个功能,即: @EnableAutoConfiguration:启用Spring Boot的自动配置机制 @ComponentScan:在应用程序所在的包上启用@Component扫

  • 我在 Java 中找到了以下代码,解释了如何使用 guice 很好地将配置参数注入为带注释的字符串参数。https://github.com/google/guice/wiki/FrequentlyAskedQuestions 我想做同样的事情,但在斯卡拉。你会怎么做? 请注意,我在寻找一个解决一般特征/类的方法。什么东西 我研究了辅助注射,但无法解决我的问题。 任何帮助都将不胜感激。谢谢

  • 我正在重构一个传统的基于Spring Batch XML的应用程序,以使用注释配置。我想了解如何将以下XML文件转换为基于注释的配置,并保持相同的关注分离。 为了便于讨论,这里有一个简单的例子。 job-config-1.xml job-config-2.xml job-config-3。xml 我想从XML配置转移到Java配置。我想为每个XML创建3个作业配置类。比如说JobConfig1。j