我正在 Weld CDI 和 Undertow 之上构建一个简单的 API 框架,以熟悉 CDI 可移植扩展编程模型。它是 JAX-RS 的严格子集:
@Default
@Path("/dogs")
public class Dogs {
@Inject
private MyService service;
@GET
public Response get(@HeaderParam("DogDebug") String debugParam, @Inject DebugService debugger) { return BLAH; }
@Path("/{id}")
@GET
public Response getById(@PathParam("id") String param) { return BLAH; }
}
我的 CDI Portable Extension 收集了所有具有 Path 注释的 AnnotatedTypes。当 CDI 完成启动时,Undertow 网络服务器启动,所有收集到的类型(及其路径)都注册到 Undertow RoutingHandler。
扩展负责为每个使用 @GET/@POST 等注释的方法构建 HttpHandlers...
public HttpHandler getHandler(AnnotatedMethod<?> producer) {
Object contextualHandler = manager.createInstance()
.select(producer.getDeclaringType().getJavaClass()).get();
Preconditions.checkNotNull(contextualHandler, "Could not obtain a contextual reference to a handler for this");
Object result = producer.getJavaMember().invoke(contextualHandler);
Response response;
if(!(result instanceof Response)) {
response = Response.ok(result).build();
} else {
response = (Response) result;
}
response.write(exchange);
}
如您所见,现在处理程序正在使用普通 Java 反射来调用资源方法。
我想让方法参数注入工作,如我上面的示例所示。在实际运行处理程序时,我可以使用 BeanManager 和元数据来获取正确的参数,但是......
如何验证注入点?即,使用我从 ProcessAnnotatedType 事件获得的 AnnotatedType,我如何验证任意方法,就好像它是生产者或构造函数或事件观察者一样?
更新:到目前为止,我对Deltaspike的InjectableMethod类已经有了很大的了解。它检查该方法并创建一个可以传递给 BeanManager.validate 的 InjectionPoint。但是,它在世界上可公开使用的 Google 代码中没有太多用处。