在用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 :_ *)
}
我找到了案件的原因以及最终如何解决它。
实际上,我还在Config
类中创建了一个propertysourcesplaceconfigurer
bean,但控制台上有一条警告消息,
@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
}
因此,一切正常。
建议您使用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