2017-01-23 6 views
0

У меня есть веб-приложение с JAX-RS, CDI и EJB. В каждом ресурсе я вводя сценарий Sessioneless SessionBean, и мой вопрос заключается в том, можно ли вводить одни и те же экземпляры в провайдер JAX-RS и Stateless SesionBean. Я пытаюсь передать некоторые данные, которые поступают в каждом запросе в Stateeless SesionBean из ContainerRequestFilter. Доступ ко всем компонентам EJB осуществляется только с помощью ресурсов jax rs.Как распространять один и тот же экземпляр с помощью CDI

Пример:

public class Bean { 
    private String attr; 

    // getter and setter 
} 

@Stateless 
public class BeanService { 

    @Inject 
    Bean bean; 

    public void doStuff() { 
     bean.getAttr(); 
     // do something with bean.attr 
    } 
} 

@Path("/bean") 
public class BeanResource { 

    @Inject 
    BeanService service; 

    @GET 
    public void doStuff() { 
     service.doStuff(): 
    } 
} 

@Provider 
public class BeanRequestFilter implements ContainerRequestFilter { 

    @Inject 
    Bean bean; 

    @Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     String data = null; // <- get data from request 
     bean.setAttr(data); 
    } 
} 

Update

Изменение Bean для Pojo, мое единственное намерение использовать класс, провести какое-то состояние, которые приходят в каждом запросе и может быть Передано в каждом вызове, начиная с PojoResource до PojoService. Я хочу сделать это таким образом, потому что все службы возвращают эти данные, и я не хочу передавать это как параметр для каждого метода.

ответ

0

Это выглядит как ваш Bean класс по существу запрашивать область действия, поэтому изменение его:

@RequestScoped 
public class Bean { 
    ... 
} 

должен иметь желаемый эффект. Тот же экземпляр будет вводиться как в BeanRequestFilter, так и в BeanService.

Однако, я думаю, вы также можете получить то, что ищете, введя ContainerRequestContext прямо в BeanService и забыли о Bean вообще.

@Stateless 
public class BeanService { 

    @Context 
    ContainerRequestContext containerRequestContext; 

    public void doStuff() { 
     // <- get data from request 
    } 
} 
+0

Спасибо , ваше предложение изменить область действия класса Bean на функции RequestScoped. – ffcc

0

Если вы хотите Bean быть своего рода одноточечного с помощью CDI см @ApplicationScopedannotation (в этом случае Bean должен быть Sersializable)

Или, если вы хотите EJB BeanService быть синглтон см @Singletonannotation

0

Прежде чем отвечать на вопрос, Bean никогда не должен обновляться. Концепция компонента - это тот, который предоставляет услугу, и использует данные для обработки запроса.

Таким образом, вы можете, конечно, предоставить данные как bean-компоненты, но тогда данные должны быть созданы в одной точке для использования и не обновляться.

Я бы поэтому использовал BeanRequestFilter для производства бобов, и пусть BeanService впрыскивает произведенный боб.

Несмотря на это, я вижу, что это данные, основанные на запросах? это данные заголовка ?, параметр запроса? Тогда я хотел бы предложить вам использовать JAX-RS @QueryParam или @HeaderParam или @PathParam или @FormParam или @CookieParam в классе JAX-RS ресурсов, а затем предоставить данные в качестве параметра объекта домена на ваш BeanService таким образом:

@Path("/api/resource-path") 
public class MyResource { 

    public void processSomething(@QueryParam("qparam") String param, @HeaderParam("hparam") String hParam) { 
     MyDomain domain = new MyDomain(qParam, hParam); 
     myService.process(domain); 
    } 
} 
Смежные вопросы