Я использую Payara 4.1.1.161. У меня есть ресурс Джерси @Path JAX-RS, и все, что я хочу сделать, это @ Вставить в него компонент, используя CDI. Я попробовал много разных комбинаций, чтобы заставить это работать, но пока единственный способ, которым я получил его, - установить bean-discovery-mode = «all» в beans.xml.Является ли bean-discovery-mode = "all" обязательным для @ Вставить компонент в ресурс Джерси @Path JAX-RS?
Я знаю, что «аннотированный» - это предпочтительный режим без 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;
}
}
Опять же, если у меня есть приложение, как показано в конфигурации выше, и с боб-открытие-режиме = «все» кажется, что все будет в порядке, и приложение развертывается без ошибок и при вызове службы JAX-RS bean-компонент вводится без ошибок. Но когда я переключаюсь на bean-discovery-mode = "annotated" ИЛИ если у меня вообще нет файла beans.xml, все происходит ужасно неправильно.
Так вы можете @ Вставить компонент в Jersy @Path JAX-RS ресурс, работающий с Payara 4.1.1.161, либо без beans.xml, либо с bean-discovery-mode = "annotated"?
Просто примечание: аннотации JAX-RS не относятся к тем, которые превращают класс в CDI-компонент. Не все аннотации, только аннотации областей CDI и некоторые другие. Вот список: http://stackoverflow.com/a/29167950/784594. И необходимый компонент ('InjectMe'), и компонент, который требует компонент (' InjectResource'), должны быть аннотированы одним из них. – OndrejM
Спасибо. Я, должно быть, пробовал каждую комбинацию аннотаций, но я не думаю, что я аннотировал конечную точку JAX-RS. Я был на 99.9% положительным, что аннотация @Path превратила его в управляемый CDI ресурс, но, конечно, я ошибся. Еще раз спасибо. –