@Before被覆盖?

/**
 * 父控制器:
 */
@Before(ParentInterceptor.class)
public abstract class ParentController extends Controller {
}

/**
 * 控制器:
 */
@Before(ThisInterceptor.class)
public abstract class ThisController extends ParentController {
}


虽然继承了父控制器,但测试发现父控制器的拦截器并没有生效

而是直接被当前控制器的@Before给覆盖了。

如果把当前控制器上的@Before注解拿掉,父控制器上的拦截器才会生效

除非使用@Before({...})数组的方式把父类的拦截器再引用一次,否则就会覆盖。


@JFinal 请问怎么才能让@Before可以继承而不是覆盖父类的拦截器

评论区

JFinal

2019-05-18 16:45

确实是这样的一个行为, 但是这个是 java 语言的规则,是 jfinal 无法插手的

继承过来的方法,如果子类中的方法有 @Before , 则父类的将失效

JFinal

2019-05-18 16:46

你自己可以用别的注解做个实验,都一样的结果,当年 jfinal 做这个功能的时候比任何人都希望拥有可继承的功能

netwild

2019-05-19 09:19

@JFinal 我测了一下,用Java8新增的@Repeatable可以实现注解继承。
前提是在整个继承关系中,至少有一个类同时标注多个@Before注解才能被JDK自动打包成注解集合而不会被子类覆盖。
有点坑啊

JFinal

2019-05-19 11:57

@netwild 这个方案复杂度、学习成本都提升了,而且会拉低 jfinal 的 aop 性能,而这个需求其实并不强烈

所以暂不支持这个方案,否则会得不偿失

热门反馈

扫码入社