0

我正在 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 代码中没有太多用处。

4

1 回答 1

0

如果我对您的理解正确,那么BeanManager#createInjectionPoint(AnnotatedParameter)就是您在创建和验证注入点方面要寻找的东西。不需要 DeltaSpike 或其他实现细节,它已经是规范的一部分。

于 2020-09-22T18:10:02.523 回答