令人难以置信的Spring错误:服务类未得到扫描

时间:2019-01-22 19:22:44

标签: scala spring-boot model-view-controller

我已经认真尝试调试了用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语义相关的愚蠢,代价高昂的错误吗?

1 个答案:

答案 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名称为空

希望这会有所帮助