如题,有一个响应请求的方法@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分双手奉上。
@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分双手奉上。
subject 对象做参数传进来?
可以把其看作配置文件中的配置属性处理,这就要求在类加载之前,需要读入这些配置属性。
可以利用反射实现,以下是一个读取方法的参数的注解配置的例子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();
}
多谢指点,我想得有点复杂了。
一直觉得Spring会提供类似于BeanPostProcess一样的扩展点来解决这个事情。翻阅官方文档未果。其实回头一想,只要用Contoller的方法做一个切面。问题就解决了。