Я создаю простую структуру 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.