我已经认真尝试调试了用Scala编写的与Spring相关的此问题,已经超过一个星期了,我非常渴望寻求外部帮助。 基本上,我的应用程序具有在Spring之上的某些功能,可以在一个存储库中运行,但是由于代码迁移的严格限制,我需要将此代码移至新的存储库。
大多数时候,我遵循新的基于模块的Gradle项目结构,在新的仓库中只是Spring应用程序的入门基础
da-report
|src
|main
|java
com.abc.da.app
service/
ComService
AppConfig
ComApp
|resources
build.gradle
但是,由于非常奇怪的原因,我一直没有得到在主应用程序类中未扫描/自动装配服务类(这太深了,我无法理解为什么不应该这样做)工作)。
Field service in com.abc.da.app.service.ComApp required a bean of type 'com.abc.da.app.service.ComService' that could not be found.
Action:
Consider defining a bean of type 'com.abc.da.app.service.ComService' in your configuration.
PS:如果仅显示代码的关键部分(忽略YAML文件中的导入语句和其他配置),请提前道歉
我已经*根据工作版本检查了所有必要的注释或逻辑*(在上一个回购中)-换句话说,这些注释看起来足以自动装配(但是很奇怪,它们没有连接)
我试图将服务子包的位置更改为与主应用程序包目录相同的级别,但是它不起作用。
ComService
....
@Service
class ComService [
}
ComApp
...
object ComApp extends App {
val cxt = new SpringApplicationBuilder().sources(classOf[ComApp])).run(args: _*)
println("contain service class? " + cxt.getBean(""))
}
@SpringBootApplication
@Import(Array=(classOf[AppConfig]))
@EnableAutoConfiguration()
class ComApp extends ApplicationRunner {
@Autowired var service: ComService = _
override def run(applicationArguments: applicationArgument) ={
}
}
AppConfig
....
@Configuration
@ComponentScan(basePackages = Array("com.abc.da.app.service"))
class AppConfig {
}
如前所述,仅测试服务类是否被识别的逻辑就完全被忽略了。我真的希望对服务子包下的所有类进行扫描(因为应用程序类已经位于根包中,所以甚至不必包括@ComponentScan)
所以,我撞了个头,但不知道是什么原因导致了这个最奇怪的错误。可能是因为包裹命名?导致该错误的命名逻辑和文件结构是否受到限制?
或者我可以犯任何与Spring语义相关的愚蠢,代价高昂的错误吗?
答案 0 :(得分:0)
我在Scala 2.12.8和JDK 1.8上尝试了Spring Boot 2.1.2.RELEASE。它的工作
//ComApp.scala
object ComApp extends App {
val cxt = new SpringApplicationBuilder().sources(classOf[ComApp]).run(args: _*)
println("contain service class? " + cxt.getBean("comService"))
}
@SpringBootApplication
@Import(value = Array(classOf[AppConfig]))
@EnableAutoConfiguration()
class ComApp extends ApplicationRunner {
@Autowired var service: ComService = _
override def run(applicationArguments: ApplicationArguments) ={
service.demo("hello")
}
}
//ComService.scala
@Service
class ComService {
def demo(str: String): Unit = println(str)
}
//AppConfig.scala
@Configuration
@ComponentScan(basePackages = Array("com.abc.da.app.service"))
class AppConfig
我在您的代码中发现了一些问题
例如导入批注应具有value = Array而不是Array =
Import(value = Array(classOf[AppConfig]))
cxt.getBean(""))
这将导致错误,因为Bean名称为空
希望这会有所帮助