Как проверить обычный метод, как если бы это был CDI InjectionPoint? - PullRequest
0 голосов
/ 04 марта 2020

Я создаю простую структуру API поверх Weld CDI и Undertow, чтобы познакомиться с моделью программирования CDI Portable Extension. Это строгое подмножество 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; }
}

My CDI Portable Extension собирает все AnnotatedTypes, которые имеют аннотацию Path. Когда CDI завершает загрузку, запускается веб-сервер Undertow, и все собранные типы (и их пути) регистрируются в Undertow RoutingHandler.

Расширение отвечает за создание HttpHandlers для каждого метода, аннотированного @ GET / @ POST et c ...

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

Как видите, сейчас обработчик использует plain-ol Java Reflection для вызова метода ресурса.

Мне бы хотелось заставить метод ввода параметров работать, как показано в моем примере выше. Я могу использовать BeanManager и метаданные, чтобы получить правильные параметры при фактическом запуске обработчика, но ...

Как я могу проверить точку внедрения? то есть с AnnotatedType, полученным из события ProcessAnnotatedType, как я могу проверить произвольный метод , как если бы он был производителем, конструктором или наблюдателем события?

Обновление: пока получил довольно далеко с классом InjectableMethod от Deltaspike. Он проверяет метод и создает InjectionPoint, который можно передать в BeanManager.validate. Тем не менее, он не имеет большого использования в общедоступном коде Google.

...