2015-03-04 5 views
1

Я использую MyFaces Apache 2.0.3 JSF, WAS 8.0.0.10INJECT @ViewScope КДИ боб в JAX-RS ресурса

В настоящее время я пытаюсь привнести в @ViewScope КДИ боб, @ViewScope в JSF 2,0 предоставлено Библиотека OmniFaces. Но я получаю сообщение об ошибке: WebBeans context with scope type annotation @ViewScoped does not exist within current thread. Когда я пытаюсь ввести фасоль cdi @SessionScope, все работает нормально.

Кодекс моих JAX-RS ресурсов:

@RequestScoped 
@Path("/events") 
public class CalendarResource implements Serializable {  
    @Inject 
    private CalendarBean calendarBean; 
    @Inject 
    private PropertiesBean propertiesBean; 

    @GET 
    @Produces("text/plain; charset=utf-8") 
    public Response getEvents(@QueryParam("calendarId") String calendarId, 
          @QueryParam("start") String start, 
          @QueryParam("end") String end, 
          @Context SecurityContext securityContext, 
          @Context HttpServletRequest req 
          ) { 


     FullCalendar selectedCalendar = calendarBean.getFullCalendar(); 


     System.out.println(calendarId + " " + start + " " + end + " " + propertiesBean.getUser().getName()); 


     return null; 

    } 

код моего КДИ боба:

@Named 
@ViewScoped 
public class CalendarBean implements Serializable { 


    @EJB 
    private CalendarEJB calendarEJB; 

    @Inject 
    private PropertiesBean propertiesBean; 



    @PostConstruct 
    public void init(){ 
     ... 
    } 

... 
} 

Что я делаю неправильно? Как только я знаю, я могу применить более широкий охват в узком пространстве. Спасибо.

ОБНОВЛЕНИЕ: Когда я изменил @ViewScope на @SessionScoped, все начало работать. Может ли он быть выпущен с OmniFaces?

ответ

4

@ViewScoped привязан к представлению JSF, однако durig запрос JAX-RS, нет никакого средства просмотра JSF в любом месте. Во время запроса JAX-RS невозможен просмотр JSF, поскольку запрос JAX-RS не инициируется отправкой JSF <h:form>, в котором содержится информация о состоянии представления JSF и будет инициировать FacesServlet для восстановления представления.

@SessionScoped действительно будет работать, если запрос JAX-RS будет запущен в том же сеансе HTTP, что и страница JSF. Однако я могу понять, что этот объем слишком широк. Возможно, вы захотите передать дополнительный параметр запроса, идентифицирующий текущее представление JSF, и получите привязку его в компоненте, включенном в сеанс (в основном, как область представления JSF работает под обложками!).

@ConversationScoped должен работать, если вы передадите параметр cid в запрос JAX-RS.

Это не проблема OmniFaces. Вы столкнулись бы с такой же проблемой с JSF 2.2 @ViewScoped из-за того, что он привязан к представлению JSF.

+0

Спасибо, BalusC, ваша помощь неоценима. – Anatoly

+0

Добро пожаловать. – BalusC

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