Jin*_*won 3 java unit-testing jax-rs jersey cdi
我正在编写一个JAX-RS库(不是应用程序).
我有:
abstract class A {
@PostConstruct
private void constructed_a() {} // not invoked
@Inject
private Some some;
}
public abstract class B extends A {
@PostConstruct
private void constructed_b() {} // not invoked
}
Run Code Online (Sandbox Code Playgroud)
和测试类:
@Path("c")
public class C extends B {
@PostConstrct
private void constructed_c() {} // invoked
}
Run Code Online (Sandbox Code Playgroud)
我正在测试jersey测试框架v2.17
我发现只constructed_c()调用它并且不调用祖先定义的那些方法.请注意,在类中some声明的field()已正确注入.@InjectA
这是正常的吗?我该怎么办?
结论
我使用embedded-glassfish进行了测试,发现正如Antonin Stefanutti指出的那样,这些回调方法按预期顺序调用.
constructed_a()
constructed_b()
constructed_c()
Run Code Online (Sandbox Code Playgroud)
小智 6
据部宣布对目标类拦截的调用顺序的的JSR 318 -拦截1.2规范:
在目标类或其超类上声明的拦截器方法按以下顺序调用:
- 如果目标类具有超类,则调用在这些超类上定义的任何拦截器方法,首先是大多数通用超类.
- 调用目标类本身的拦截器方法(如果有).
如果一个拦截器方法被另一个方法覆盖(无论该方法本身是否是一个拦截器方法),它将不会被调用.
这意味着在编写库/框架时,可以@PostConstruct在父类和子类中使用lifecyle回调时实现可扩展性.
该机制在Camel CDI扩展中使用,该扩展@PostConstruct在https://github.com/astefanutti/camel-cdi/blob/b6f52d91b247e36eefb6f3ecde61016d681d3535/impl/src/main/java/org/apache/中声明了具有生命周期回调的默认Camel上下文.骆驼/ CDI/CdiCamelContext.java#L37
这可以通过https://github.com/astefanutti/camel-cdi/blob/b6f52d91b247e36eefb6f3ecde61016d681d3535/envs/se/src/main/java/org/apache/camel/cdi/se/bean/CustomLifecycleCamelContext等用户进行扩展..java#L37声明自己的@PostConstruct生命周期回调.
两者都按照指定的顺序由容器调用.
这意味着从设计的角度来看,您的方法是正确的.然而,由于泽西依赖注入是基于HK2而不是CDI并且依赖于桥梁,jersey-gf-cdi因此在该级别可能存在问题.
| 归档时间: |
|
| 查看次数: |
5629 次 |
| 最近记录: |