在发布此特定问题之前,我读了很多QnA。回答了大多数 javaassist无效常量18 问题,以升级 javaassist lib。基于这些QnA,我还在我的项目中将lib升级到最新版本,它确实有效。但是,如果可以的话,我不理解关注并需要某人帮助才能提供一些见解:
这是环境
当前版本: JDK:build 1.8.0_92-b14
javaassist:3.14.0.GA
Hibernate:3.5.1-Final
构建用途:Ant
截止日期项目代码中没有lamda或stream。 代码构建和运行成功。到目前为止没有问题。
现在,当我使用Lambdas和Streams时会发生这种情况。
案例1:没有javaassist升级 现在,只要我在同一个项目中介绍任何Lamda和Stream,然后关注 在Spring容器启动时,特别是在服务器启动期间抛出异常。 奇怪的是,根据IoC容器中显示的日志,Lambda和Stream确实初始化了没有问题的类,但是尝试启动EntityYmanager的现有bean之一获得了运行时异常。 基于QnA评论之一谈论
案例2 :只要将java辅助版升级到最新版本(或 3.17.0-GA 以上的任何内容),一切正常。
问题:为什么在拥有Lambdas的类中没有抛出异常,但现有的hibernate的Entitity Manager在项目没有任何lambda / stream时工作正常?在抛出此异常时,已成功加载lambda的Infact 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
答案 0 :(得分:4)
无法创建EntityManager实例,因为管理器正在加载的类失败。然后它不是管理器的javassist问题,而是由它加载的类。因此,完全有可能有一次没有问题创建管理器(在使用中没有lambda)和一次失败(使用lambdas)。错误消息表明旧的javaassist版本不了解invokedynamic指令,这意味着它是一个pre Java7版本。只有Java7中的java本身才使用该指令,这使得问题完全可能只出现在java8代码中。 lambdas正在使用invokedynamic。