Javassist аннотации проблема - PullRequest
4 голосов
/ 12 июня 2010

Я пытаюсь сгенерировать свой класс Entity, используя javassist.Все шло хорошо, пока я не добавил аннотацию GeneratedValue в поле Id.Аннотация @Id работает нормально, но когда я добавляю @GeneeratedValue, я получаю исключение.Это мой код:

  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.Когда я использую это без идентификатора, я получаю это исключение.Когда я использую отладчик eclipse для просмотра значений переменных, я получаю это

com.sun.jdi.InvocationException occurred invoking method.

вместо значения аннотации.но для аннотации Id он показывает объект аннотации javassist.

Я новичок в javassist.Кто-нибудь может мне помочь?

1 Ответ

5 голосов
/ 03 мая 2011

Полагаю, вы больше не ищите того, что случилось (у меня сегодня была такая же проблема), но если вы это сделаете ...

При использовании конструктора Annotation (ConstPool cp, CtClass clazz) javassist preсоздает все члены для этого класса аннотаций (см. Annotation.java, строка 98).

В этом случае это просто, потому что есть явный комментарий: «// todo Enums не поддерживаются сейчас».(строка 101), и, как вы можете видеть в javax.persistence.GeneratedValue, есть член с именем стратегии типа GenerationType, который является Enum.

Хотя, если в классе Annotation есть какие-либо члены класса типа, он не будетработать, вызывая исключение NullPointerException для метода MemberValue.write классов-потомков.

Решение или обходной путь - это то, что вы сделали, используя другой конструктор, который оставляет элементы для добавления вручную, или (не думаю, что это хороший вариант) установите экземпляр для каждого члена класса в Annotation.

PS: я использую javassist 3.12.1.GA

...