简体   繁体   中英

Spring Modify a field of any class that marked by a custom annotation

I want to mark a field of a class with my custom annotation. And whenever any method is invoke I want to do some modification on that field.

public class Message{
    public Integer id;

    @FreeText   // this is my custom annotation 
    public String htmlMsg;
    public String textMsg ;
 }

This annotation (@FreeText) can be used in any class. In seasar framework, I can do this by create an interceptor and override invoke method. The I can get the object of this class and the find the field that marked with my annotation and modify it. However, i cannot find a way to do it in Spring. In spring, I found some method like MethodInvocationInterceptor, but I don't know how to implement it. Can you suggest any way to do this in Spring?

Seasar2 and Spring are very close. I have not tested but you can do something like this. First create FreeText custom annotation

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface FreeText {}

Then create the following interceptor

public class EncryptSensitiveDataInterceptor extends MethodInterceptor {
@Override
public Object invoke(MethodInvocation in) throws Throwable {

    Object[] params = in.getArguments();

    Object param = params[0];
    for (Field field : param.getClass().getDeclaredFields()) {
        for (Annotation anno : field.getDeclaredAnnotations()) {
            if (anno instanceof FreeText) {
              field.set(param, [YOUR CUSTOM LOGIC METHOD]);
     }

  }
 }
  return in.proceed();
}

Hope this help.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM