mybatis 自定义拦截器是否可以获得自定义的注解

yu120623 2017-11-15 10:34:25

图中的方法是mybatis的Mapper接口里的一个方法 有一个自定义的注解
是否可以在mybatis的拦截器里获取到这个注解?

求大神解答
...全文
1606 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
muinomarts 2020-11-10
  • 打赏
  • 举报
回复
这样感觉效率有点低,不过我也没想到更好的方法,本来想在网上看看大佬们有没有更好的办法,看来还是只有跟大佬一样反射去做了
「已注销」 2020-04-20
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
[quote=引用 5 楼 小萤哥 的回复:] [quote=引用 3 楼 繁华终归落尽 的回复:] 测试了一下,是可以的

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoFilter {
    String value() default "";
}

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		// final Executor executor = (Executor) invocation.getTarget();
		final Object[] args = invocation.getArgs();
		final MappedStatement mappedStatement = (MappedStatement) args[0];
		final Object parameter = args[1];
		final RowBounds rowBounds = (RowBounds) args[2];
		String namespace = mappedStatement.getId();
		String className = namespace.substring(0,namespace.lastIndexOf("."));
		String methedName= namespace.substring(namespace.lastIndexOf(".") + 1,namespace.length());
		Method[] ms = Class.forName(className).getMethods();
		for(Method m : ms){
			if(m.getName().equals(methedName)){
				Annotation annotation = m.getAnnotation(NoFilter.class);
				System.out.println(annotation.toString());
			};
		}
	}
你这个不能出现方法重载,出现重载后,你可能就找出目标了[/quote] 可以再改进下,参数都有,找到正确的method还是很简单的[/quote] 其实是我自己的问题,mybatis是以namespace+id的形式来确定SQL的,因此mapper接口不能重载
微瞰技术 2020-04-20
  • 打赏
  • 举报
回复
虽然还没结帖。但是我想说。mybatis源码里获取select之类的注解就是先获取到方法然后再获取注解的
「已注销」 2020-03-04
  • 打赏
  • 举报
回复
引用 3 楼 繁华终归落尽 的回复:
测试了一下,是可以的

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoFilter {
    String value() default "";
}

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		// final Executor executor = (Executor) invocation.getTarget();
		final Object[] args = invocation.getArgs();
		final MappedStatement mappedStatement = (MappedStatement) args[0];
		final Object parameter = args[1];
		final RowBounds rowBounds = (RowBounds) args[2];
		String namespace = mappedStatement.getId();
		String className = namespace.substring(0,namespace.lastIndexOf("."));
		String methedName= namespace.substring(namespace.lastIndexOf(".") + 1,namespace.length());
		Method[] ms = Class.forName(className).getMethods();
		for(Method m : ms){
			if(m.getName().equals(methedName)){
				Annotation annotation = m.getAnnotation(NoFilter.class);
				System.out.println(annotation.toString());
			};
		}
	}
你这个不能出现方法重载,出现重载后,你可能就找出目标了
maradona1984 2020-03-04
  • 打赏
  • 举报
回复
引用 5 楼 小萤哥 的回复:
[quote=引用 3 楼 繁华终归落尽 的回复:] 测试了一下,是可以的

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoFilter {
    String value() default "";
}

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		// final Executor executor = (Executor) invocation.getTarget();
		final Object[] args = invocation.getArgs();
		final MappedStatement mappedStatement = (MappedStatement) args[0];
		final Object parameter = args[1];
		final RowBounds rowBounds = (RowBounds) args[2];
		String namespace = mappedStatement.getId();
		String className = namespace.substring(0,namespace.lastIndexOf("."));
		String methedName= namespace.substring(namespace.lastIndexOf(".") + 1,namespace.length());
		Method[] ms = Class.forName(className).getMethods();
		for(Method m : ms){
			if(m.getName().equals(methedName)){
				Annotation annotation = m.getAnnotation(NoFilter.class);
				System.out.println(annotation.toString());
			};
		}
	}
你这个不能出现方法重载,出现重载后,你可能就找出目标了[/quote] 可以再改进下,参数都有,找到正确的method还是很简单的
ruchiruzui2012 2018-07-25
  • 打赏
  • 举报
回复
这是不存在的
小刀雨斑 2017-11-15
  • 打赏
  • 举报
回复
AOP里面是 method.getAnnotation(.clazz)
繁华终归落尽 2017-11-15
  • 打赏
  • 举报
回复
测试了一下,是可以的

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoFilter {
    String value() default "";
}

	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		// final Executor executor = (Executor) invocation.getTarget();
		final Object[] args = invocation.getArgs();
		final MappedStatement mappedStatement = (MappedStatement) args[0];
		final Object parameter = args[1];
		final RowBounds rowBounds = (RowBounds) args[2];
		String namespace = mappedStatement.getId();
		String className = namespace.substring(0,namespace.lastIndexOf("."));
		String methedName= namespace.substring(namespace.lastIndexOf(".") + 1,namespace.length());
		Method[] ms = Class.forName(className).getMethods();
		for(Method m : ms){
			if(m.getName().equals(methedName)){
				Annotation annotation = m.getAnnotation(NoFilter.class);
				System.out.println(annotation.toString());
			};
		}
	}
正怒月神 2017-11-15
  • 打赏
  • 举报
回复
我用的也是 aop 。在拦截器中没试过。 接口 s = method.getAnnotation(接口.class);

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧