DATACMNS-916 - Fix setter lookup in ClassGeneratingPropertyAccessorFactory.

Previously, ClassGeneratingPropertyAccessorFactory uses boxed types for primitive type setters. This threw NoSuchMethodExceptions and caused ExceptionInInitializerError as the generated class could not be initialized. We now use the appropriate argument type to look up setters.

Also, we now only generate accessor usage if the property is configured to use property access in the first place.

Original pull request: #178.
This commit is contained in:
Mark Paluch
2016-09-23 14:12:26 +02:00
committed by Oliver Gierke
parent 3811ce5873
commit 0e29af3a15
3 changed files with 126 additions and 10 deletions

View File

@@ -511,12 +511,15 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert
for (PersistentProperty<?> property : persistentProperties) {
if (property.getGetter() != null && generateMethodHandle(entity, property.getGetter())) {
visitPropertyGetterInitializer(property, mv, entityClasses, internalClassName);
}
if(property.usePropertyAccess()) {
if (property.getSetter() != null && generateMethodHandle(entity, property.getSetter())) {
visitPropertySetterInitializer(property, mv, entityClasses, internalClassName);
if (property.getGetter() != null && generateMethodHandle(entity, property.getGetter())) {
visitPropertyGetterInitializer(property, mv, entityClasses, internalClassName);
}
if (property.getSetter() != null && generateMethodHandle(entity, property.getSetter())) {
visitPropertySetterInitializer(property, mv, entityClasses, internalClassName);
}
}
if (property.getField() != null && generateSetterMethodHandle(entity, property.getField())) {
@@ -636,7 +639,15 @@ public class ClassGeneratingPropertyAccessorFactory implements PersistentPropert
mv.visitTypeInsn(ANEWARRAY, JAVA_LANG_CLASS);
mv.visitInsn(DUP);
mv.visitInsn(ICONST_0);
mv.visitLdcInsn(Type.getType(referenceName(Type.getInternalName(autoboxType(setter.getParameterTypes()[0])))));
Class<?> parameterType = setter.getParameterTypes()[0];
if (parameterType.isPrimitive()) {
mv.visitFieldInsn(GETSTATIC, Type.getInternalName(autoboxType(setter.getParameterTypes()[0])), "TYPE",
referenceName(JAVA_LANG_CLASS));
} else {
mv.visitLdcInsn(Type.getType(referenceName(parameterType)));
}
mv.visitInsn(AASTORE);
mv.visitMethodInsn(INVOKEVIRTUAL, JAVA_LANG_CLASS, "getDeclaredMethod", String.format("(%s[%s)%s",