当前位置: 首页 > 知识库问答 >
问题:

我如何验证一个正常的方法,如果它是一个CDI注入点?

农永宁
2023-03-14

我正在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可移植扩展收集所有带有路径注释的带注释的数据类型。当CDI完成引导时,一个下拖Web服务器将启动,所有收集的类型(及其路径)都将注册到下拖RoutingHandler。

扩展负责为每个用@GET/@POST等注释的方法构建HttpHandler。。。

    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);
    }

如您所见,现在处理程序正在使用普通的olJava反射来调用资源方法。

我想让方法参数注入工作,如上面的示例所示。当实际运行处理程序时,我可以使用BeanManager和元数据来获取正确的参数,但是...

如何验证注入点?i、 e.使用从ProcessAnnotatedType事件中获得的AnnotatedType,如何验证任意方法,就好像它是生产者、构造函数或事件观察者一样?

更新:到目前为止,我对Deltaspike中的InjectableMethod类已经有了很大的了解。它检查方法并创建可传递给BeanManager的注入点。验证然而,它在世界上公开的谷歌代码中没有太多的用途。

共有1个答案

南门新知
2023-03-14

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

 类似资料: