Java 使用流过滤器的实体在带有TomEE的OpenJPA上生成StringIndexOutOfBoundsException
我在NetBeans 8.0.2上使用OpenJPA 2.0和TomEE 1.7.2,在我在实体类中添加一些Java 8代码之前,它工作得很好,但现在我在开始使用TomEE时得到了StringIndexOutOfBoundsException 我有一个班级电话Java 使用流过滤器的实体在带有TomEE的OpenJPA上生成StringIndexOutOfBoundsException,java,jpa,netbeans,openjpa,apache-tomee,Java,Jpa,Netbeans,Openjpa,Apache Tomee,我在NetBeans 8.0.2上使用OpenJPA 2.0和TomEE 1.7.2,在我在实体类中添加一些Java 8代码之前,它工作得很好,但现在我在开始使用TomEE时得到了StringIndexOutOfBoundsException 我有一个班级电话 @Entity @Table(name = "PHONES") public class Phone implements Serializable, Cloneable { @Id @Column(name = "PHO
@Entity
@Table(name = "PHONES")
public class Phone implements Serializable, Cloneable {
@Id
@Column(name = "PHONE_ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "PHONE_NUMBER", nullable = false)
private String number;
@ManyToOne
@JoinColumn(name = "PERSON_ID", nullable = false)
private Person owner;
}
我有一个班上的人
@Entity
@Table(name = "PEOPLE")
public class Person implements Serializable, Cloneable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PERSON_ID")
private long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch = FetchType.EAGER)
private Set<Phone> phones;
}
@实体
@表(name=“PEOPLE”)
公共类Person实现可序列化、可克隆{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“PERSON\u ID”)
私人长id;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“owner”,fetch=FetchType.EAGER)
私人电话;
}
我有一个方法setPhones,它使用了一个来正确设置所有者:
public void setPhones(Set<Phone> phones) {
if (phones != null && !phones.isEmpty()) {
for (Phone phone : phones) {
if (phone != null) {
phone.setOwner(this);
}
}
}
this.phones = phones;
}
public void设置电话(设置电话){
if(phones!=null&&!phones.isEmpty()){
用于(电话:电话){
如果(电话!=null){
电话号码:setOwner(this);
}
}
}
这个。电话=电话;
}
然后,我改为使用Java8流/过滤器
public void setPhones(Set<Phone> phones) {
if (phones != null && !phones.isEmpty()) {
phones.stream().filter((phone) -> (phone != null)).forEach((phone) -> {
phone.setOwner(this);
});
}
this.phones = phones;
}
public void设置电话(设置电话){
if(phones!=null&&!phones.isEmpty()){
phones.stream().filter((phone)->(phone!=null)).forEach((phone)->{
电话号码:setOwner(this);
});
}
这个。电话=电话;
}
在这次更改之后,我在启动时收到以下消息:
WARNING: An exception was thrown while attempting to perform class file transformation on "com.mydomain.Person": java.lang.StringIndexOutOfBoundsException: String index out of range: 29789
at java.lang.String.checkBounds(String.java:373)
at java.lang.String.<init>(String.java:413)
at serp.bytecode.lowlevel.ConstantPoolTable.readString(ConstantPoolTable.java:112)
at serp.bytecode.lowlevel.ConstantPoolTable.readString(ConstantPoolTable.java:174)
at org.apache.openjpa.enhance.PCClassFileTransformer.isEnhanced(PCClassFileTransformer.java:241)
at org.apache.openjpa.enhance.PCClassFileTransformer.needsEnhance(PCClassFileTransformer.java:195)
at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:140)
at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:127)
at org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:292)
at org.apache.openejb.persistence.PersistenceUnitInfoImpl$PersistenceClassFileTransformer.transform(PersistenceUnitInfoImpl.java:362)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
at org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:171)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
at org.apache.openejb.cdi.CdiScanner.load(CdiScanner.java:299)
at org.apache.openejb.cdi.CdiScanner.process(CdiScanner.java:248)
at org.apache.openejb.cdi.CdiScanner.init(CdiScanner.java:182)
at org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:180)
at org.apache.openejb.cdi.ThreadSingletonServiceImpl.initialize(ThreadSingletonServiceImpl.java:160)
at org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:41)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:846)
at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:652)
at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1261)
at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1100)
at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:130)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5416)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:677)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1912)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
警告:尝试在“com.mydomain.Person”上执行类文件转换时引发异常:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:29789
位于java.lang.String.checkBounds(String.java:373)
位于java.lang.String。(String.java:413)
位于serp.bytecode.lowlevel.ConstantPoolTable.readString(ConstantPoolTable.java:112)
位于serp.bytecode.lowlevel.ConstantPoolTable.readString(ConstantPoolTable.java:174)
在org.apache.openjpa.enhanced.PCClassFileTransformer.isEnhanced(PCClassFileTransformer.java:241)
位于org.apache.openjpa.enhance.PCClassFileTransformer.needsEnhance(PCClassFileTransformer.java:195)
位于org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:140)
位于org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:127)
位于org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:292)
位于org.apache.openejb.persistence.PersistenceUnitInfoImpl$PersistenceClassFileTransformer.transform(PersistenceUnitInfoImpl.java:362)
位于sun.instrument.TransformerManager.transform(TransformerManager.java:188)
在sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)上
位于java.lang.ClassLoader.defineClass1(本机方法)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:760)
位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
位于org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
位于org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
位于org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
位于org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:171)
位于org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
位于org.apache.openejb.cdi.CdiScanner.load(CdiScanner.java:299)
位于org.apache.openejb.cdi.CdiScanner.process(CdiScanner.java:248)
位于org.apache.openejb.cdi.CdiScanner.init(CdiScanner.java:182)
位于org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:180)
位于org.apache.openejb.cdi.threadsingletonserviceinpl.initialize(threadsingletonserviceinpl.java:160)
位于org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:41)
位于org.apache.openejb.assembler.classic.assembler.createApplication(assembler.java:846)
位于org.apache.openejb.assembler.classic.assembler.createApplication(assembler.java:652)
位于org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1261)
位于org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1100)
位于org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:130)
位于org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
位于org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
位于org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5416)
位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
位于org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
位于org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
位于org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
位于org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:677)
位于org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1912)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
运行(Thread.java:744)
我的“解决方案”是把以前的方法放回去,它工作得很好。但是我希望能够在我的项目中使用Java8。
我做错什么了吗?如果是,那是什么?看起来TomEE 1.7.2使用了“serp”库的旧版本(1.14.1)对实体bean进行字节码操作。不幸的是,该版本不支持使用一些新的Java8特性(特别是lambdas)的类。您可以尝试更新到最新版本的serp(尽管可能存在不兼容),看看是否可以通过这种方式工作 检查并确定两者都是固定的(这意味着最终TomEE应该得到更新,在其JPA实体中拥有完整的Java8支持)