【问题标题】:EJB Container initialization error, could not invoke defineClassEJB 容器初始化错误,无法调用 defineClass
【发布时间】:2018-02-22 16:11:40
【问题描述】:

当我尝试运行时,我的 glassfish 抛出异常。

[2018-02-22T17:07:04.135+0100] [glassfish 5.0] [严重] [] [javax.enterprise.system.core] [tid:_ThreadID=46 _ThreadName=admin-listener(4)] [timeMillis: 1519315624135] [levelValue: 1000] [[ 加载应用程序时出现异常:EJB 容器初始化错误 java.lang.RuntimeException: 不能 调用defineClass!

我在这里上传了服务器日志:https://pastebin.com/cB0EgG4Y

用户道

@Stateless
class UserDao : Abstract<User>() {
    override fun getEntityClass(): Class<User> {
        return User::class.java
    }
}

抽象道

@Stateless
abstract class Abstract<T : Model> {
    @PersistenceContext(unitName = "kwetter")
    private lateinit var entityManager: EntityManager

    abstract fun getEntityClass(): Class<T>

    fun find(id: Int): T {
        return entityManager.find(getEntityClass(), id)
    }
}

服务

@Stateless
class UserService {
    @Inject private var userDao: UserDao? = null

    fun find(id: Int): User {
        return userDao!!.find(id)
    }
}

API 端点

@Stateless
@Named
@Path("/users")
class Users {
    @Inject private var userService: UserService? = null

    @GET
    @Path("/{id}")
    @Produces("application/json")
    fun single(@PathParam("id") id: Int): User {
        return userService!!.find(id)
    }
}

【问题讨论】:

    标签: jakarta-ee kotlin glassfish


    【解决方案1】:

    在 Kotlin 中,默认情况下所有类都隐含为 final,因此您的日志中会出现此错误:

    原因:java.lang.VerifyError:无法从最终类继承 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:763)

    如果您想扩展您的课程,请将它们标记为开放:

    类上的 open 注解与 Java 的 final 相反:它允许其他人从这个类继承。默认情况下,所有类 Kotlin 是 final,对应 Effective Java,Item 17: Design 和文件继承或禁止它。

    https://kotlinlang.org/docs/reference/classes.html#inheritance

    【讨论】:

      【解决方案2】:

      您也可以使用 all-open-compiler-pluginshttps://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin

      Kotlin 默认有类和它们的成员 final,这使得它 不方便使用 Spring AOP 等框架和库 要求开课。全开放编译器插件适配 Kotlin 满足这些框架的要求并使类注释 具有特定注释及其成员在没有显式的情况下打开 打开关键字

      另请参阅:https://dzone.com/articles/the-state-of-kotlin-for-jakarta-eemicroprofile-tra

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 2021-05-19
        相关资源
        最近更新 更多