【问题标题】:Inject @ViewScope cdi bean into JAX-RS resource将@ViewScope cdi bean 注入 JAX-RS 资源
【发布时间】:2015-05-05 15:34:56
【问题描述】:

我正在使用 MyFaces Apache 2.0.3 JSF,WAS 8.0.0.10

目前我正在尝试在 OmniFaces 的库提供的 JSF 2.0 中注入 @ViewScope cdi bean @ViewScope。但我收到一个错误: 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 bean 的代码:

@Named
@ViewScoped
public class CalendarBean implements Serializable {


    @EJB
    private CalendarEJB calendarEJB;

    @Inject
    private PropertiesBean propertiesBean;



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

...
}

我做错了什么?只要我知道,我可以在狭窄的范围内注入更广泛的范围。谢谢。

更新:当我将@ViewScope 更改为@SessionScoped 时,一切都开始工作了。 OmniFaces 可能有问题吗?

【问题讨论】:

    标签: jsf jsf-2 jax-rs cdi omnifaces


    【解决方案1】:

    @ViewScoped 与 JSF 视图相关联,但是在 JAX-RS 请求期间,任何地方都无法使用 JSF 视图。在 JAX-RS 请求期间没有恢复 JSF 视图,因为 JAX-RS 请求不是由提交 JSF <h:form> 发起的,该 JSF <h:form> 包含有关 JSF 视图状态的信息,并会触发 FacesServlet 以恢复视图。

    如果在与 JSF 页面相同的 HTTP 会话中触发 JAX-RS 请求,@SessionScoped 确实可以工作。但是我可以理解,这个范围太宽泛了。您可能想要传递一个额外的请求参数来标识当前的 JSF 视图,并在会话范围的 bean 中获取它的映射(这基本上就是 JSF 视图范围在幕后工作的方式!)。

    如果您将 cid 参数传递给 JAX-RS 请求,@ConversationScoped 应该可以工作。

    这不是 OmniFaces 问题。由于 JSF 2.2 @ViewScoped 与 JSF 视图绑定的性质,您将面临完全相同的问题。

    【讨论】:

    • 感谢 BalusC,您的帮助非常宝贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多