2016-09-22 5 views
1

Я использую 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"?

ответ

4

Ваш класс ресурсов JAX-RS должен иметь аннотацию, определяющую компонент, чтобы включить вставку компонента CDI. Просто добавьте @ApplicationScoped или @RequestScoped к вашему ресурсу JAX-RS, и в этом случае bean-инъекция будет работать без режима поиска bean.

BTW Я предполагаю, что bean также имеет аннотацию области видимости некоторой формы, поскольку она не показана в коде выше.

Например,

@Path("inject") 
@ApplicationScoped 
public class InjectResource { 
+0

Просто примечание: аннотации JAX-RS не относятся к тем, которые превращают класс в CDI-компонент. Не все аннотации, только аннотации областей CDI и некоторые другие. Вот список: http://stackoverflow.com/a/29167950/784594. И необходимый компонент ('InjectMe'), и компонент, который требует компонент (' InjectResource'), должны быть аннотированы одним из них. – OndrejM

+0

Спасибо. Я, должно быть, пробовал каждую комбинацию аннотаций, но я не думаю, что я аннотировал конечную точку JAX-RS. Я был на 99.9% положительным, что аннотация @Path превратила его в управляемый CDI ресурс, но, конечно, я ошибся. Еще раз спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^