Jakarta Faces 4.0+Kotlin在WildFly部署及WELD问题求助
解决Jakarta EE 10/11 + Kotlin 1.9/2.0 + WildFly 32的WELD相关问题
问题1:页面显示正常但Kotlin Controller日志无输出(控制器未执行)
- 启用Kotlin
all-open插件:Kotlin默认类和方法为final,CDI需要代理可继承的类。在Gradle配置中添加插件,并指定Jakarta EE相关注解自动开放类:plugins { id("org.jetbrains.kotlin.plugin.allopen") version "2.0.0-RC3" } allOpen { annotation("jakarta.inject.Named") annotation("jakarta.ejb.Stateless") annotation("jakarta.faces.view.ViewScoped") // 按需添加其他CDI/JSF注解 } - 检查JSF页面的控制器绑定:确认XHTML中
#{usersKotlinController}的名称与@Named注解的value一致(Kotlin默认是类名首字母小写),action方法的签名是否正确(无参数、返回String或Unit)。 - 验证日志初始化:确保KLogger的初始化正确,比如:
同时检查WildFly的日志配置,确保对应包的日志级别设置为INFO或DEBUG。private val logger = KotlinLogging.logger {}
问题2:Kotlin 2.0-RC3下WELD-000119:找不到io.github.oshai.kotlinlogging.KLogger
- 确认kotlin-logging依赖版本适配Kotlin 2.0:使用支持Kotlin 2.0的版本(如
6.0.0及以上),Gradle依赖配置:implementation("io.github.oshai:kotlin-logging-jvm:6.0.0") - 检查EAR模块依赖:如果是EAR部署,确保包含kotlin-logging依赖的模块(如WAR或EJB模块)已正确引入,且依赖未被标记为
provided(WildFly未内置该库)。 - 验证CDI扫描范围:在
beans.xml中确认未排除io.github.oshai包,WildFly默认会扫描所有类路径下的CDI bean,若自定义了扫描规则需调整。
问题3:Java转Kotlin 2.0后WELD-000810:final字段无法使用@Inject
- 替换字段注入为构造函数注入(推荐,符合CDI最佳实践):Kotlin主构造函数支持直接注入依赖,避免final字段问题:
@Named class UsersKotlinController @Inject constructor( private val userEjb: UserStatelessEjb ) { // 业务逻辑 } - 若坚持字段注入,将
val改为lateinit var:因为@Inject在实例化后注入,需要字段可延迟初始化:@Named class UsersKotlinController { @Inject lateinit var userEjb: UserStatelessEjb // 业务逻辑 } - 注意:Kotlin中
val对应Java的final字段,CDI不允许注入final字段,因此必须使用var或构造注入。
内容的提问来源于stack exchange,提问作者NOTiFY
相关产品推荐
相关产品推荐

