4

javassist を使用して Entity クラスを生成しようとしています。GeneratedValue アノテーションを Id フィールドに追加するまでは、すべてうまくいきました。@Id アノテーションは正常に機能しますが、@GeneratedValue を追加すると例外が発生します。これは私のコードです:

  ClassPool cp = ClassPool.getDefault();
  CtClass ctClass = cp.makeClass("test.Snake");
  ClassFile classFile = ctClass.getClassFile();
  classFile.setVersionToJava5();

  AnnotationsAttribute attribute = new AnnotationsAttribute(classFile.getConstPool(), AnnotationsAttribute.visibleTag);

  Annotation idAnnotation = new Annotation(classFile.getConstPool(), ClassPool.getDefault().get("javax.persistence.Id"));
  attribute.addAnnotation(idAnnotation);

  Annotation gvAnnotation = new Annotation(classFile.getConstPool(), ClassPool.getDefault().get("javax.persistence.GeneratedValue"));
  attribute.addAnnotation(gvAnnotation);

  CtField idField = new CtField(ClassPool.getDefault().get("java.lang.Long"), "id", ctClass);
  idField.getFieldInfo().addAttribute(attribute);
  ctClass.addField(idField);

  CtField nameField = new CtField(ClassPool.getDefault().get("java.lang.String"), "name", ctClass);
  ctClass.addField(nameField);

  AnnotationsAttribute attr = new AnnotationsAttribute(classFile.getConstPool(), AnnotationsAttribute.visibleTag);
  Annotation annotation = new Annotation(classFile.getConstPool(), ClassPool.getDefault().get("javax.persistence.Entity"));
  attr.addAnnotation(annotation);
  classFile.addAttribute(attr);

  snakeClass = ctClass.toClass();
  newInstance = snakeClass.newInstance();

そして、これは私が得る例外です:

java.lang.NullPointerException
 at javassist.bytecode.ConstPool.getUtf8Info(ConstPool.java:565)
 at javassist.bytecode.annotation.EnumMemberValue.getValue(EnumMemberValue.java:98)
 at javassist.bytecode.annotation.EnumMemberValue.write(EnumMemberValue.java:116)
 at javassist.bytecode.annotation.Annotation.write(Annotation.java:316)
 at javassist.bytecode.AnnotationsAttribute.setAnnotations(AnnotationsAttribute.java:246)
 at javassist.bytecode.AnnotationsAttribute.addAnnotation(AnnotationsAttribute.java:211)
 at ClassLoadingTest.javassitTest(ClassLoadingTest.java:56)

@GeneratedValue に問題があるようです。IDなしで単独で使用すると、この例外も発生します。eclipseデバッガーを使用して変数値を監視すると、これが得られます

com.sun.jdi.InvocationException occurred invoking method.

注釈値の代わりに。ただし、Id アノテーションの場合は javassist アノテーション オブジェクトが表示されます。

私はjavassistが初めてです。誰でも私を助けることができますか?

4

1 に答える 1

6

もう何が起こったのかを探しているわけではないと思いますが(今日も同じ問題がありました)、もしそうなら...

コンストラクター Annotation(ConstPool cp, CtClass clazz) を使用すると、javassist はその Annotation クラスのすべてのメンバーを事前に作成します (Annotation.java の 98 行目を参照)。

この場合、「// todo Enums are not supported now.」という明示的なコメントがあるため簡単です。(101 行目) javax.persistence.GeneratedValue でわかるように、列挙型である GenerationType 型の strategy と呼ばれるメンバーがあります。

ただし、Annotation クラスに class 型のメンバーがある場合は機能せず、子孫クラスの MemberValue.write メソッドで NullPointerException が発生します。

解決策または回避策は、メンバーを手動で追加する別のコンストラクターを使用するか、(これは良いオプションではないと思います) Annotation で各クラスメンバーのインスタンスを設定することです。

PS: javassist 3.12.1.GA を使用しています

于 2011-05-02T21:47:00.893 に答える