是否可以在不编写任何额外样板的情况下自动装配 KSP 生成的类?

问题描述 投票:0回答:1

我有一个使用 Konvert 创建 Dto/Domain 映射器的界面,它使用 KSP。

@Konverter
interface SimpleNoteMapper {
  fun toDto(note: SimpleNote): SimpleNoteDto
  fun toDomain(note: SimpleNoteDto): SimpleNote
}

生成的类是:

public object SimpleNoteMapperImpl : SimpleNoteMapper {
  @GeneratedKonverter(priority = 5_000)
  override fun toDto(note: SimpleNote): SimpleNoteDto = SimpleNoteDto(
    id = note.id,
    name = note.name
  )

  @GeneratedKonverter(priority = 5_000)
  override fun toDomain(note: SimpleNoteDto): SimpleNote = SimpleNote(
    id = note.id,
    name = note.name
  )
}

我想使用

@Autowired
将生成的类注入我的
Controller

@RestController
class SimpleNotesController {
  @Autowired
  lateinit var simpleNoteMapper: SimpleNoteMapper
  [...]
}

但是我得到的错误是:

Field simpleNoteMapper in com.project.example.simplenotes.api.controller.SimpleNotesController required a bean of type 'com.project.example.simplenotes.api.mapper.SimpleNoteMapper' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.project.example.simplenotes.api.mapper.SimpleNoteMapper' in your configuration.

我知道我可能需要能够向生成的类添加注释,对吗?但这是不可能的,因为它是生成的。我可以通过为此映射器创建配置来解决此问题:

@Configuration
class MapperConfiguration {
  @Bean
  fun simpleNoteMapper(): SimpleNoteMapper {
    return SimpleNoteMapperImpl
  }
}

该应用程序可以工作,但我不确定是否有某种方法可以删除这个样板,因为我认为为每个生成的类创建配置不是一个好主意。因此,我正在寻找一种东西,可以将其简化为一个注释或一个能够覆盖所有映射器的类。感谢您的阅读。

spring kotlin dto
1个回答
0
投票

虽然似乎有一些 Spring 行为会自动将接口与实现进行匹配(例如

InterfaceA
InterfaceAImpl
匹配),但在这种情况下它不起作用,因为 Konvert 在中使用
object
而不是
class
生成的代码(可能)。

幸运的是,Konvert 有插件可以解决这个问题。

我必须补充:

    implementation("io.mcarle:konvert-spring-annotations:2.4.0")
    ksp("io.mcarle:konvert-spring-injector:2.4.0")

到我的

build.gradle.kts
文件,然后将
@KComponent
注释添加到映射器接口:

@Konverter
@KComponent
interface SimpleNoteMapper {
  fun toDto(note: SimpleNote): SimpleNoteDto
  fun toDomain(note: SimpleNoteDto): SimpleNote
}

这会生成一个 Spring 感知映射器,无需额外的样板即可注入。

© www.soinside.com 2019 - 2024. All rights reserved.