Внедрить cdi-компонент @ViewScope в ресурс JAX-RS

Я использую MyFaces Apache 2.0.3 JSF, WAS 8.0.0.10.

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

Код моего ресурса 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;

    }

Код моего компонента CDI:

@Named
@ViewScoped
public class CalendarBean implements Serializable {


    @EJB
    private CalendarEJB calendarEJB;

    @Inject
    private PropertiesBean propertiesBean;



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

...
}

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

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


person Anatoly    schedule 04.03.2015    source источник


Ответы (1)


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

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

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

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

person BalusC    schedule 04.03.2015
comment
Спасибо BalusC, ваша помощь неоценима. - person Anatoly; 04.03.2015