You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的初始化正确,比如:
    private val logger = KotlinLogging.logger {}
    
    同时检查WildFly的日志配置,确保对应包的日志级别设置为INFO或DEBUG。

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:45:55