【发布时间】:2016-09-22 09:23:37
【问题描述】:
我正在尝试创建一个注入解析器。我有一个数据类:
public class MyData {
...
}
我有以下注释:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyDataInject {
}
我的注入解析器如下所示:
public class MyDataInjectionResolver extends ParamInjectionResolver<MyDataInject> {
public MyDataInjectionResolver () {
super(MyDataValueFactoryProvider.class);
}
@Singleton
public static class MyDataValueFactoryProvider extends AbstractValueFactoryProvider {
@Inject
public MyDataValueFactoryProvider(MultivaluedParameterExtractorProvider provider, ServiceLocator locator) {
super(provider, locator, Parameter.Source.UNKNOWN);
}
@Override
protected Factory<?> createValueFactory(Parameter parameter) {
System.out.println(parameter.getRawType());
System.out.println(Arrays.toString(parameter.getAnnotations()));
System.out.println("------------------------------------------------------------------");
System.out.println();
... create factory and return ...
}
}
}
我的绑定如下:
bind(MyDataValueFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
bind(MyDataInjectionResolver.class).to(new TypeLiteral<InjectionResolver<MyDataInject>>() {}).in(Singleton.class);
为了简洁起见,我将实际工厂的实现放在一边。一切正常,但我注意到一些我无法解释的行为。我正在使用以下 JAX-RS 资源进行测试:
@Path("test")
public class Test {
@GET
public Response test(@MyDataInject @Valid MyData data) {
return Response.status(Response.Status.OK).entity("Hello world!").build();
}
}
- 我注意到的第一件事是
MyDataValueFactoryProvider.createValueFactory在启动期间被调用了两次。这是为什么?这闻起来像一些错误。好处是工厂只在客户端发出请求时访问一次。 - 另一个观察结果是,如果我删除资源中的
@MyDataInject注释,如下所示 (*),MyDataValueFactoryProvider.createValueFactory仍会被调用。这是为什么?这很奇怪,因为它应该只绑定到@MyDataInject? (update) 当参数不属于MyData类时,它甚至会被调用,参见下面的第二个变体。
(*) 没有@MyDataInject注解的资源:
@Path("test")
public class Test {
@GET
public Response test(/*@MyDataInject*/ @Valid MyData data) {
return Response.status(Response.Status.OK).entity("Hello world!").build();
}
}
另一种变体:
@Path("test")
public class Test {
@GET
public Response test(@Valid SomeOtherClass data) {
return Response.status(Response.Status.OK).entity("Hello world!").build();
}
}
【问题讨论】:
标签: java spring dependency-injection jersey hk2