Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用流过滤器的实体在带有TomEE的OpenJPA上生成StringIndexOutOfBoundsException_Java_Jpa_Netbeans_Openjpa_Apache Tomee - Fatal编程技术网

Java 使用流过滤器的实体在带有TomEE的OpenJPA上生成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

我在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 = "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支持)