Я создаю небольшое приложение Java EE 8, которое должно работать на OpenLiberty. Он имеет JAX-RS ContainerResponseFilter
, который выглядит так:
package my.package;
import javax.inject.Inject;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class MyFilter implements ContainerResponseFilter {
private final MyService myService;
@Inject
public DiagnosticsFilter(final MyService myService) {
this.myService = myService;
}
@Override
public void filter(final ContainerRequestContext request, final ContainerResponseContext response) {
// Never mind this
}
}
Если я напишу такой фильтр и запущу свое приложение, аргумент myService
для конструктора будет null
. Однако, если поле аннотировано @Inject
, а конструктор опущен, поле вставляется правильно.
Класс MyService
помечен @Stateless
, а в beans.xml
я установил bean-discovery-mode="all"
.
Любая идея, что я делаю неправильно? Это вообще должно работать? документация по сварке предлагает что так и должно быть, но я не уверен, что это есть и в спецификации CDI...
jaxrs
отвечает за фактическое создание фильтра, прежде чем делегировать его контейнеруcdi
для выполнения конкретной инъекции CDI. Вот почему внедрение поля работает, а внедрение конструктора — нет. - person maress   schedule 14.02.2019