Menu

Adding a TargetObjectResolver to ReflectionUt

2012-10-06
2013-01-25
  • Andreas Joseph Krogh

    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?

    • Andreas
     
  • Andreas Joseph Krogh

    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)

     

Log in to post a comment.