Kotlin kann die Annotation zur Kompilierungszeit nicht einfügen, z. B. durch die vorhandene Bibliothek Lombok. Gibt es eine anständige Möglichkeit, Annotation für Spring Framework zur Laufzeit zu injizieren?Annotation Injection für Spring mit Kotlin
0
A
Antwort
1
Angenommen, Sie versuchen, Logger Annotation in Spring-Anwendung zu injizieren.
Hier Beispiel Annotation-Klasse: Log.kt
package com.example.util
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD)
@MustBeDocumented
annotation class Log
Diese Klasse inject Anmerkung zur Laufzeit: LogInjector.kt
package com.example.util
import org.slf4j.LoggerFactory
import org.springframework.beans.BeansException
import org.springframework.beans.factory.config.BeanPostProcessor
import org.springframework.stereotype.Component
import org.springframework.util.ReflectionUtils
import java.lang.reflect.Field
@Component
class LogInjector: BeanPostProcessor {
@Throws(BeansException::class)
override fun postProcessAfterInitialization(bean: Any, beanName: String): Any {
return bean
}
@Throws(BeansException::class)
override fun postProcessBeforeInitialization(bean: Any, name: String): Any {
ReflectionUtils.doWithFields(bean.javaClass,
@Throws(IllegalArgumentException::class, IllegalAccessException::class) { field: Field ->
// SAM conversion for Java interface
ReflectionUtils.makeAccessible(field)
if (field.getAnnotation(Log::class.java) != null) {
val log = LoggerFactory.getLogger(bean.javaClass)
field.set(bean, log)
}
}
)
return bean
}
}
Dann verwendet diese Klasse @Log
Anmerkung: GreetingController .kt
package com.example.web
import org.slf4j.Logger
import org.springframework.web.bind.annotation.*
@RestController
class GreetingController {
@Log lateinit private var logger: Logger
@RequestMapping("/greeting")
fun greeting(): String {
logger.info("Greeting endpoint was called")
return "Hello"
}
}
Um zu vermeiden, dass der Logger in Null-Safe wie logger?.info('...')
aufgerufen wird, wird in diesem Beispiel die Eigenschaft durch the late-initialized modifier markiert.
Verwandte Themen
- 1. Spring Annotation funktioniert nicht in Kotlin
- 2. Dependency Injection mit EJB Annotation
- 3. Kotlin Annotation IntDef
- 4. Kotlin - wie Annotation Attributwert
- 5. Kotlin Annotation Prozessor + Autoservice
- 6. Bug in Kotlin Annotation?
- 7. Spring inject ohne Autowire Annotation
- 8. Spring Injection in JSP
- 9. Spring @Configurable Annotation mit AspectJ
- 10. Aktivieren der Spring Security globale Methodensicherheit bricht Dependency Injection (mit Kotlin)
- 11. Injection Werte für statische Konstanten in Spring
- 12. AngularJS Dependency Injection - Implizite vs Array Annotation
- 13. Java Spring - Annotation-Konfigurationsklasse
- 14. Spring Annotation-Based Interceptor
- 15. @Transaction Annotation für Integrationstest in Spring Boot
- 16. Spring Boot @RequestMapping Annotation
- 17. Spring @ Async Annotation
- 18. Annotation basierte Spring Security für REST API
- 19. Spring Conditional Annotation Operator
- 20. Spring MVC Annotation @ModelAttribute
- 21. Spring Inheritance - Annotation
- 22. Spring @Transactional Annotation Verhalten
- 23. Spring Retryable Annotation ClassNotFoundException
- 24. Implementierung einer Java-Annotation in Kotlin
- 25. Spring Batch-Projekt mit Annotation integriert mit Spring Batch Admin
- 26. Spring Annotation Lazy Load
- 27. Kotlin erhalten Feld Annotation immer leer
- 28. Spring Transactional Annotation
- 29. Spring Injection in Struts RequestProcessor
- 30. Moshi benutzerdefinierte Qualifier Annotation in Kotlin
Das funktionierte für mich! – hughjdavey