I use Hibernate and for lazy-loaded proxies the "validatedObject" is often a proxy which when passed to Oval for validation doesn't contain the actual values, because the values are in the "target" object inside the generated proxy. I have patched my local Oval to include a TargetObjectResolver:
Hi.
I use Hibernate and for lazy-loaded proxies the "validatedObject" is often a proxy which when passed to Oval for validation doesn't contain the actual values, because the values are in the "target" object inside the generated proxy. I have patched my local Oval to include a TargetObjectResolver:
public interface TargetObjectResolver {
Object resolveTarget(Object obj);
}
And have ReflectionUtils use it like so:
{code}
public final class ReflectionUtils
// …
private static TargetObjectResolver targetObjectResolver;
public static void setTargetObjectResolver(TargetObjectResolver targetObjectResolver)
{
ReflectionUtils.targetObjectResolver = targetObjectResolver;
}
// …
public static Object getFieldValue(final Field field, final Object obj) throws AccessingFieldValueFailedException
{
try
{
if (!field.isAccessible()) AccessController.doPrivileged(new SetAccessibleAction(field));
Object targetObject = resolveTarget(obj);
return field.get(targetObject);
}
catch (final Exception ex)
{
throw new AccessingFieldValueFailedException(field.getName(), obj, ContextCache.getFieldContext(field), ex);
}
}
private static Object resolveTarget(Object obj) {
if (obj != null && targetObjectResolver != null)
{
return targetObjectResolver.resolveTarget(obj);
}
else
{
return obj;
}
}
{code}
I have a patch for this here: http://home.officenet.no/~andreak/target-object-resolver.diff
Any chance such a thing might get merged/implemented?
My HibernateTargetObjectResolver looks like this (I use it from Scala):
object HibernateTargetObjectResolver extends TargetObjectResolver {
def resolveTarget(obj: AnyRef): AnyRef = {
obj match {
case proxy: HibernateProxy => proxy.getHibernateLazyInitializer.getImplementation
case _ => obj
}
}
}
This is set in ReflectionUtils in my custom Validator's constructor:
ReflectionUtils.setTargetObjectResolver(HibernateTargetObjectResolver)