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

6ioyuze2  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(135)

我有一个使用Konvert创建Dto/DomainMap器的接口,它使用KSP。

  1. @Konverter
  2. interface SimpleNoteMapper {
  3. fun toDto(note: SimpleNote): SimpleNoteDto
  4. fun toDomain(note: SimpleNoteDto): SimpleNote
  5. }

字符串
生成的类是:

  1. public object SimpleNoteMapperImpl : SimpleNoteMapper {
  2. @GeneratedKonverter(priority = 5_000)
  3. override fun toDto(note: SimpleNote): SimpleNoteDto = SimpleNoteDto(
  4. id = note.id,
  5. name = note.name
  6. )
  7. @GeneratedKonverter(priority = 5_000)
  8. override fun toDomain(note: SimpleNoteDto): SimpleNote = SimpleNote(
  9. id = note.id,
  10. name = note.name
  11. )
  12. }


我想将使用@Autowired生成的类注入到我的Controller中。

  1. @RestController
  2. class SimpleNotesController {
  3. @Autowired
  4. lateinit var simpleNoteMapper: SimpleNoteMapper
  5. [...]
  6. }


但我得到的错误是:

  1. 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.
  2. The injection point has the following annotations:
  3. - @org.springframework.beans.factory.annotation.Autowired(required=true)
  4. Action:
  5. Consider defining a bean of type 'com.project.example.simplenotes.api.mapper.SimpleNoteMapper' in your configuration.


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

  1. @Configuration
  2. class MapperConfiguration {
  3. @Bean
  4. fun simpleNoteMapper(): SimpleNoteMapper {
  5. return SimpleNoteMapperImpl
  6. }
  7. }


应用程序工作,但我不确定是否有一些方法来删除这个样板,因为我不觉得这是一个好主意,为每个生成的类创建一个配置。所以我正在寻找的东西,将简化为一个注解或一个类,将能够覆盖所有的Map器。感谢阅读。

7hiiyaii

7hiiyaii1#

虽然似乎有一些Spring行为自动匹配接口到实现(例如InterfaceA匹配InterfaceAImpl),但在这种情况下它不起作用,因为Konvert在生成的代码中使用object而不是class(可能)。
幸运的是,Konvert有插件,可以解决这个问题。
我不得不补充:

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

字符串
到我的build.gradle.kts文件,然后将@KComponent注解添加到mapper接口:

  1. @Konverter
  2. @KComponent
  3. interface SimpleNoteMapper {
  4. fun toDto(note: SimpleNote): SimpleNoteDto
  5. fun toDomain(note: SimpleNoteDto): SimpleNote
  6. }


这将生成一个Spring感知的Mapper,可以在没有额外样板的情况下注入。

展开查看全部

相关问题