Непостижимая ошибка Spring: класс обслуживания не сканируется - PullRequest
0 голосов
/ 22 января 2019

Я пытался отладить эту проблему, связанную с Spring, написанную в Scala более недели, и я очень отчаянно пытаюсь обратиться за внешней помощью.По сути, у меня есть приложение с некоторыми функциями поверх Spring, работающее в одном репо, но из-за строгих ограничений на перенос кода, мне нужно переместить этот код в новое репо.

Большую часть времени я отделял в новом репо только начальные основы приложения Spring, следуя этой общей модульной структуре проекта Gradle

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 голосов
/ 23 января 2019

Я пробовал с Spring Boot 2.1.2. ВЫПУСКАЙТЕ на Scala 2.12.8 и JDK 1.8. Его работает

//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

Я нашел проблему в вашем коде

например. Импортная аннотация должна иметь значение = Массив, а не Массив =

Import(value = Array(classOf[AppConfig]))

cxt.getBean(""))

Это выдаст ошибку, так как имя Бина пусто

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...