gpt4 book ai didi

java - 为什么 javaassist 抛出无效常量类型 : 18 when loading Entitymanager only when lambdas are used in project

转载 作者:搜寻专家 更新时间:2023-11-01 02:21:13 27 4
gpt4 key购买 nike

在发布这个具体问题之前,我阅读了很多 QnA。大多数 javaassist invalid constant 18 问题已得到解答以升级 javaassist 库。基于这些 QnA,我还在我的项目中将 lib 升级到最新版本并且它确实有效。但是我不理解以下内容,如果可以的话,需要有人的帮助来提供一些见解:

这是环境

当前版本:JDK:构建 1.8.0_92-b14

java助手:3.14.0.GA

hibernate :3.5.1-Final

构建用途:Ant

到目前为止项目在代码中没有 lamda 或流。代码构建并成功运行。到目前为止没有问题。

现在,这是我使用 Lambdas 和 Streams 时发生的情况。

案例 1: 没有 javaassist 升级现在,一旦我在同一个项目中引入任何 Lamda 和 Stream,然后特别是当 Spring 容器启动时,在服务器启动期间抛出异常。奇怪的是,根据 IoC 容器中显示的日志,具有 Lambda 和 Stream 的类确实得到了初始化,没有任何问题,但是尝试启动 EntityYmanager 的现有 bean 之一得到运行时异常。基于 QnA 评论之一谈论

情况 2:只要将 java assist 升级到最新版本(或任何高于 3.17.0-GA 的版本),一切正常。

问题:为什么没有在具有 Lambda 的类中抛出异常,而是在项目没有任何 lambda/流时工作正常的现有 hibernate 实体管理器?事实上,当抛出此异常时,具有 lambda 的 Bean 已成功加载并位于容器内。

谁能解释一下?

这是完整的错误跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean     
with name 'ldbEntityManagerFactory' defined in ServletContext resource
[/WEB-INF/spring/JPA.xml]: Invocation of init method failed; nested
exception is java.lang.RuntimeException: Error while reading
file:/C:/home/tcserver/profiles/instance/webapps/app/WEB-INF/classes
-------deleted--------------
... 25 more
**Caused by: java.io.IOException: invalid constant type: 18**
at javassist.bytecode.ConstPool.readOne(ConstPool.java:1090)
at javassist.bytecode.ConstPool.read(ConstPool.java:1033)
at javassist.bytecode.ConstPool.<init>(ConstPool.java:149)
at javassist.bytecode.ClassFile.read(ClassFile.java:764)
at javassist.bytecode.ClassFile.<init>(ClassFile.java:108)
atorg.hibernate.ejb.packaging.AbstractJarVisitor.checkAnnotationMatching(Abs
tractJarVisitor.java:236)
atorg.hibernate.ejb.packaging.AbstractJarVisitor.executeJavaElementFilter(Ab
stractJarVisitor.java:202)
aorg.hibernate.ejb.packaging.AbstractJarVisitor.addElement(AbstractJarVisito
r.java:163)
aorg.hibernate.ejb.packaging.ExplodedJarVisitor.getClassNamesInTree(Exploded
JarVisitor.java:101)
----DELETED---
g.hibernate.ejb.Ejb3Configuration.scanForClasses(Ejb3Configuration.java:614)
... 31 more

最佳答案

创建 EntityManager 实例失败,因为管理器正在加载的类失败。那么这不是管理器的javassist问题,而是它加载的类的问题。因此,完全有可能一次创建管理器没有问题(在使用中没有 lambda),一次失败(使用 lambda)。错误信息表明旧的javaassist 版本不理解invokedynamic 指令,这意味着它是Java7 之前的版本。只是在Java7中java本身并没有使用该指令,这就完全有可能出现java8代码才会出现的问题。 lambda 正在使用 invokedynamic。

关于java - 为什么 javaassist 抛出无效常量类型 : 18 when loading Entitymanager only when lambdas are used in project,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com