我有一个使用 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 行为会自动将接口与实现进行匹配(例如
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 感知映射器,无需额外的样板即可注入。