“”中构造函数的参数 0 需要找不到类型为“”的 bean

Parameter 0 of constructor in '' required a bean of type '' that could not be found

我正在创建一个 spring 引导应用程序,并将 doma 用于 O/R 映射器。

我无法启动应用程序,因为 repositoryimpl 找不到 dao class,但我可以在 build/classes 中看到它们。所以构建成功但应用程序启动失败。

我该如何解决?

套餐

建造class

道​​class

package com.event.app.backend.infrastructure.dao

import com.event.app.backend.infrastructure.table.EventsTableRecord
import org.seasar.doma.Dao
import org.seasar.doma.Select
import org.seasar.doma.Update
import org.seasar.doma.boot.ConfigAutowireable

@ConfigAutowireable
@Dao
interface EventDao {

  @Select
  fun getEvents():List<EventsTableRecord>

  @Select
  fun getEventById(eventId:String):EventsTableRecord

  @Update(sqlFile = true)
  fun updateTicketCnt(eventId:String,bookTicketCnt:Int):Int

  @Update(sqlFile = true)
  fun subtractTicketCnt(eventId:String,subtractCount:Int):Int
}

实施class

@Repository
class EventRepositoryImpl(
  private val eventDao: EventDao,
  private val userDao: UserDao,
) : EventRepository {

  /**
   * get Events
   */
  override fun getEvents(): List<Event> {
   // return convertToEvent(eventDao.getEvents())
    return listOf(Event(
      name = "event1",
      description =  "description1",
      date = LocalDate.now(),
      availableTickets = 1
    ))
  }

-omit the  details-

build.gradle

buildscript{
    repositories{
        mavenCentral()
    }
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.10")
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.6.2")
    }
}
plugins{
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}

apply plugin: "java"
apply plugin: "kotlin"

repositories {
    mavenCentral()
}

// テンポラリディレクトリのパスを定義する
ext.domaResourcesDir = "${buildDir}/tmp/doma-resources"

// domaが注釈処理で参照するリソースをテンポラリディレクトリに抽出
task extractDomaResources(type: Copy)  {
    dependsOn processResources

    from processResources.destinationDir
    include 'doma.compile.config'
    include 'META-INF/**/*.sql'
    include 'META-INF/**/*.script'
    into domaResourcesDir
}

// テンポラリディレクトリ内のリソースをcompileJavaタスクの出力先ディレクトリにコピーする
task copyDomaResources(type: Copy, dependsOn: extractDomaResources)  {
    dependsOn extractDomaResources
    from domaResourcesDir
    into compileJava.destinationDir
}

compileJava {
     // 上述のタスクに依存させる
      dependsOn copyDomaResources
    // テンポラリディレクトリをcompileJavaタスクの入力ディレクトリに設定する
    inputs.dir domaResourcesDir
    options.encoding = 'UTF-8'
}

compileTestJava {
    options.encoding = 'UTF-8'
    // テストの実行時は注釈処理を無効にする
    options.compilerArgs = ['-proc:none']
}

dependencies {

    // spring starter web
    implementation ("org.springframework.boot:spring-boot-starter-web")

    // doma sprig boot starter
    implementation ("org.seasar.doma.boot:doma-spring-boot-starter:1.5.0")
    // domaの注釈処理を実行することを示す
    annotationProcessor 'org.seasar.doma:doma:2.29.0'
    // domaへの依存を示す
    implementation 'org.seasar.doma:doma:2.29.0'
}

repositories {
    mavenCentral()
}


dependencyManagement{
    imports{
        mavenBom "org.springframework.boot:spring-boot-dependencies:2.6.2"
    }
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    kotlinOptions {
        jvmTarget = '11'
    }
}

已添加UserDao.kt

package com.event.app.backend.infrastructure.dao

import com.event.app.backend.infrastructure.table.UsersTicketsTableRecord
import org.seasar.doma.Dao
import org.seasar.doma.Insert
import org.seasar.doma.Select
import org.seasar.doma.boot.ConfigAutowireable

@ConfigAutowireable
@Dao
interface UserDao {

  @Insert
  fun insertUsersTickets(usersTicketsTableRecord: UsersTicketsTableRecord):Result<UsersTicketsTableRecord>

  @Select
  fun getTicketCntByEventUserId(eventId:String,userId:String):Int
}

在 Spring Boot 的情况下,您需要在 BeanConfig 中定义 Dao。我想这在这种情况下是相似的。

import org.jdbi.v3.core.Jdbi;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import se.xxx.dao.*;

@Configuration
public class BeanConfig {

    @Bean
    public SwingPositionDao swingPositionDao(@Qualifier("jdbi.manager") Jdbi jdbi) {
        return jdbi.onDemand(SwingPositionDao.class);
    }
}

当您将 Doma 与 Kotlin 一起使用时,您需要使用 kapt 而不是 build.gradle 中的 annotationProcessor。 可以在 build/generated/source/kapt.

下找到 kapt 生成的代码

以下示例存储库可能会有所帮助。 https://github.com/domaframework/kotlin-sample