ebean-orm / ebean-agent

Enhancer Agent for EbeanORM
Apache License 2.0
12 stars 13 forks source link

VerifyError: Bad type on operand stack when using Builder pattern with Entity #119

Closed rbygrave closed 5 years ago

rbygrave commented 5 years ago

https://github.com/ebean-orm/ebean/issues/1751

java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    io/X/db/model/DbGroup.<init>(Lio/X/db/model/DbGroup$Builder;)V @58: invokevirtual
  Reason:
    Type 'io/X/db/model/DbGroup$Builder' (current frame, stack[1]) is not assignable to 'io/X/db/model/DbGroup'
  Current Frame:
    bci: @58
    flags: { }
    locals: { 'io/X/db/model/DbGroup', 'io/X/db/model/DbGroup$Builder' }
    stack: { 'io/X/db/model/DbGroup', 'io/X/db/model/DbGroup$Builder' }
  Bytecode:
    0000000: 2ab7 0048 2abb 004a 592a b700 4db5 004f
    0000010: 2a2b b400 54b6 0058 2a2b b400 5ab6 005e
    0000020: 2a2b b400 60b6 0064 2a2b b400 66b6 006a
    0000030: 2a2b b400 6cb6 0070 2a2b b600 74b6 0078
    0000040: 2a2b b600 7bb6 007e b1                 

    at java.lang.Class.getDeclaredMethods0(Native Method) ~[?:?]
    at java.lang.Class.privateGetDeclaredMethods(Class.java:3167) ~[?:?]
    at java.lang.Class.privateGetPublicMethods(Class.java:3192) ~[?:?]
    at java.lang.Class.getMethods(Class.java:1905) ~[?:?]
    at io.ebeaninternal.server.deploy.BeanLifecycleAdapterFactory.addLifecycleMethods(BeanLifecycleAdapterFactory.java:46) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.createDeployBeanInfo(BeanDescriptorManager.java:1317) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.readEntityDeploymentInitial(BeanDescriptorManager.java:715) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.deploy.BeanDescriptorManager.deploy(BeanDescriptorManager.java:371) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.core.InternalConfiguration.<init>(InternalConfiguration.java:197) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:124) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:69) ~[ebean-11.39.1.jar:?]
    at io.ebeaninternal.server.core.DefaultContainer.createServer(DefaultContainer.java:35) ~[ebean-11.39.1.jar:?]
    at io.ebean.EbeanServerFactory.create(EbeanServerFactory.java:58) ~[ebean-11.39.1.jar:?]
    at io.ebean.Ebean$ServerManager.getWithCreate(Ebean.java:126) ~[ebean-11.39.1.jar:?]
    at io.ebean.Ebean$ServerManager.<init>(Ebean.java:75) [ebean-11.39.1.jar:?]
    at io.ebean.Ebean$ServerManager.<init>(Ebean.java:48) [ebean-11.39.1.jar:?]
    at io.ebean.Ebean.<clinit>(Ebean.java:43) [ebean-11.39.1.jar:?]
    at io.ebean.DB.getDefault(DB.java:76) [ebean-11.39.1.jar:?]

Steps to reproduce

package test.model.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.Set;
import java.util.UUID;

@Entity
@Table(name = "fh_group")
public class DbGroup {

  @Id
  private UUID id;

  private String name;

  private boolean adminGroup;

//  @ManyToOne(optional = false)
//  private DbPerson whoCreated;

  @OneToMany(mappedBy = "group")
  private Set<DbPerson> peopleInGroup;

//  EntityBeanIntercept _intercept;

  public DbGroup() {
  }

  public UUID getId() {
    return id;
  }

  public void setId(UUID id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public boolean isAdminGroup() {
    return adminGroup;
  }

  public void setAdminGroup(boolean adminGroup) {
    this.adminGroup = adminGroup;
  }

  public Set<DbPerson> getPeopleInGroup() {
    return peopleInGroup;
  }

  public void setPeopleInGroup(Set<DbPerson> peopleInGroup) {
    this.peopleInGroup = peopleInGroup;
  }

  private DbGroup(Builder builder) {
//    this._intercept = new EntityBeanIntercept(this);

    setAdminGroup(builder.adminGroup);
    setName(builder.name);
    setPeopleInGroup(builder.peopleInGroup);
  }

  public static final class Builder {

    private DbPerson whoCreated;
    private boolean adminGroup;
    private String name;
    private Set<DbPerson> peopleInGroup;

    public Builder() {
    }

    public Builder whoCreated(DbPerson val) {
      whoCreated = val;
      return this;
    }

    public Builder adminGroup(boolean val) {
      adminGroup = val;
      return this;
    }

    public Builder name(String val) {
      name = val;
      return this;
    }

    public Builder peopleInGroup(Set<DbPerson> val) {
      peopleInGroup = val;
      return this;
    }

    public DbGroup build() {
      return new DbGroup(this);
    }
  }
}