2010-11-30 12 views
9

Estoy desarrollando un aspecto que comprueba los argumentos de los métodos setter y sobrescribe cadenas vacías con valor nulo. Este es mi estado hasta ahora:Aspectj sobrescribe un argumento de un método

@Before("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)") 
public void check(final JoinPoint jp) { 
    LOGGER.debug(jp.getSignature().toLongString()); 
    Object[] args = jp.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     if (args[i] instanceof String && ((String) args[i]).isEmpty()) { 
      args[i] = null; 
     } 
    } 
}

Por desgracia, la declaración de sobreescritura args[i] = null; hace ahora funciona! ¿Alguien sabe cómo debo sobrescribirlo?

Saludos,

Kevin

+0

@Kevin por cierto podrías reemplazar esto 'if (args [i] instanceof String && ((String) args [i]). IsEmpty())' con este 'if (" ". Equals (args [i])) ' –

+0

Gracias, ¿es más rápido? Mayo a causa del casting – eglobetrotter

+0

No creo que haya mucha diferencia en términos de rendimiento, pero mi versión es más legible y, por lo tanto, menos propensa a errores –

Respuesta

-3

@Ralph usted tiene toda la razón, la diferencia es que con un consejo en torno soy capaz de pasar los argumentos a la excecution! Esto funciona bien ahora!

@Around("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)") 
public void checkAroundSetter(final ProceedingJoinPoint pjp) 
    throws Throwable { 
    LOGGER.debug(pjp.getSignature().toLongString()); 
    Object[] args = pjp.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     if (args[i] instanceof String && ((String) args[i]).isEmpty()) { 
      args[i] = null; 
     } 
    } 
    pjp.proceed(args); 
} 

Hola gente ¿Qué opinas sobre performace?

+4

Esto no es una respuesta. Si desea responder a la respuesta de Ralph, publique un comentario, si desea agregar información adicional, edite su pregunta. Deberías eliminar esta respuesta. –

+0

Pero tengo otra pregunta relacionada con mi tema. – eglobetrotter

+0

luego publique una nueva pregunta. ASÍ QUE las preguntas son una a la vez –

28

creo que tiene que poner en práctica un consejo alrededor, en lugar de un antes consejo.

porque se puede utilizar proceder con sus nuevos argumentos:

proceed(newArgs); 
+0

Gracias, ¿por qué tengo que impulsar un consejo en lugar de antes? ¿Dónde está la diferencia, excepto que con un consejo aproximado, puedo controlar la ejecución de un método, capturar excepciones y verificar el valor de retorno? – eglobetrotter

+7

Un consejo anterior obtiene una copia del argumento matriz, pero no puede modificar los argumentos originales. Para eso es un consejo para todos. Ralph: +1 –

Cuestiones relacionadas