Я использую Payara 4.1.1.161. У меня есть ресурс Jersey @Path JAX-RS, и все, что я хочу сделать, это @Inject bean в него с помощью CDI. Я пробовал много разных комбинаций, чтобы заставить это работать, но пока единственный способ заставить его работать успешно — установить bean-discovery-mode="all" в beans.xml.
Я знаю, что "аннотированный" является предпочтительным режимом, а beans.xml еще более предпочтительным. Но каждый раз, когда я пытался использовать «аннотированный», у меня либо сбой при вызове ресурса JAX-RS, который выглядит следующим образом:
MultiException stack 1 of 1
org.glassfish.hk2.api.UnsatisfiedDependencyException:
There was no object available for injection at
SystemInjecteeImpl(requiredType=InjectMe, parent=InjectResource,
qualifiers={}, position=-1, optional=false, self=false,
unqualified=null, 1000687916))
Или у меня произошел сбой при развертывании приложения, которое выглядит так:
Exception during lifecycle processing
java.lang.Exception: java.lang.IllegalStateException:
ContainerBase.addChild: start: org.apache.catalina.LifecycleException:
org.apache.catalina.LifecycleException:
org.jboss.weld.exceptions.DeploymentException: WELD-001408:
Unsatisfied dependencies for type InjectMe with qualifiers @Default
at injection point [BackedAnnotatedField]
@Inject private org.thoth.jaspic.web.InjectResource.me
Вот моя настройка приложения.
beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
bean-discovery-mode="all">
</beans>
Приложение JAX-RS
@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationResourceConfig extends org.glassfish.jersey.server.ResourceConfig {
public ApplicationResourceConfig() {
register(RolesAllowedDynamicFeature.class);
registerClasses(
org.thoth.jaspic.web.InjectResource.class
);
}
}
Ресурс JAX-RS
@Path("inject")
public class InjectResource {
@Inject
private InjectMe me;
@GET
@Produces(MediaType.TEXT_HTML)
public String getText(@Context SecurityContext context) {
Principal p = context.getUserPrincipal();
String retval = "<h3>inject</h3>";
retval += String.format("<p>me=[%s]</p>", me);
return retval;
}
}
Простой компонент, который я хочу внедрить
public class InjectMe implements Serializable {
private static final long serialVersionUID = 158775545474L;
private String foo;
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
}
Опять же, если у меня есть мое приложение, как показано выше, с конфигурацией выше и с bean-discovery-mode="all", все кажется в порядке, и приложение развертывается без ошибок, а при вызове службы JAX-RS bean-компонент вводится без ошибок. Но когда я переключаюсь на bean-discovery-mode="annotated" ИЛИ, если у меня вообще нет файла beans.xml, все идет ужасно неправильно.
Итак, можете ли вы @Inject bean-компонент в JAX-RS-ресурс Jersy @Path с запущенной Payara 4.1.1.161 либо без beans.xml, либо с bean-discovery-mode="annotated"?