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

6ioyuze2  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(47)

我有一个使用Konvert创建Dto/DomainMap器的接口,它使用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.


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

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


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

7hiiyaii

7hiiyaii1#

虽然似乎有一些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注解添加到mapper接口:

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


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

相关问题