如题,有一个响应请求的方法@Controller
@RequestMapping(value = "/xxx")
public class SomeController {

@RequestMapping(value = "/yyy")
public ModelAndView someUrlProcess(@SomeAnnotation("SpEL here") Subject subject) {
return new ModelAndView("abc");
}
}
Subject是跟业务有关的一个对象可以通过一个SpEL表达式得到。
有什么办法能使我的这个@SomeAnnotation起作用吗。求思路。 200分双手奉上。

解决方案 »

  1.   

    你是想 /xxx/yyy 这个请求时
    subject 对象做参数传进来?
      

  2.   

    以下根据个人理解:由于注解的值都是在编译前编码的,所以其值都固定的。
    可以把其看作配置文件中的配置属性处理,这就要求在类加载之前,需要读入这些配置属性。
    可以利用反射实现,以下是一个读取方法的参数的注解配置的例子public class T { /**
     * @param args
     */
    public static void main(String[] args) { /* T.ta(@FirstName(name="China") @SecondName(name="China") String name, @SecondName(name="Chinese") String sendName)
     * 取以上方法的第一个参数的第一个注解的name值
     */
    Class<T> cls = T.class;
    for( Method m : cls.getMethods()){
    if(m.getName().equals("ta")){
    Annotation[][] ans = m.getParameterAnnotations();
    if(ans.length > 0){
    Annotation[] as = ans[0];
    Annotation a0 = as[0];
    if(FirstName.class.isInstance(a0)){
    FirstName fn = (FirstName)a0;
    String defaultName = fn.name();//结果:第一个参数的第一个注解的name值
    }

    }
    }
    }
    }
    public void ta(@FirstName(name="China") @SecondName(name="China") String name, @SecondName(name="Chinese") String sendName){
    System.out.print(name);
    }
    }
    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @interface FirstName {
    public String name();
    }
    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @interface SecondName {
    public String name();
    }
      

  3.   


    多谢指点,我想得有点复杂了。
    一直觉得Spring会提供类似于BeanPostProcess一样的扩展点来解决这个事情。翻阅官方文档未果。其实回头一想,只要用Contoller的方法做一个切面。问题就解决了。
      

  4.   

    看了这贴,感觉离spring还很遥远啊