我有一个使用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器。感谢阅读。
1条答案
按热度按时间7hiiyaii1#
虽然似乎有一些Spring行为自动匹配接口到实现(例如
InterfaceA
匹配InterfaceAImpl
),但在这种情况下它不起作用,因为Konvert在生成的代码中使用object
而不是class
(可能)。幸运的是,Konvert有插件,可以解决这个问题。
我不得不补充:
字符串
到我的
build.gradle.kts
文件,然后将@KComponent
注解添加到mapper接口:型
这将生成一个Spring感知的Mapper,可以在没有额外样板的情况下注入。