MyFaces CODI和windowId请求参数问题

时间:2011-10-18 04:04:04

标签: jsf-2 myfaces codi

我一直在尝试对 Seam Weld MyFaces CODI 进行一些简单的测试。将CODI jar文件添加到我的项目后,我发现它为每个请求添加了一个 windowId 请求值,即使bean范围是 RequestScoped 。当bean在 RequestScoped 中时,是否真的有必要在每个请求中添加 windowId 请求参数?对于这种情况,是否有任何实际的现实场景?如果没有必要可以将其删除吗?例如:

这是bean类的代码:

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named("myBean")
@RequestScoped
public class MyBean{
private String firstName;
private String lastName;

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}
}

这是页面正文:

<body>
<h:form>
<h:inputText value="#{myBean.firstName}"></h:inputText>
<br/>
<h:inputText value="#{myBean.lastName}"></h:inputText>
<br/>
<h:commandButton value="submit"></h:commandButton>
</h:form>
</body>

2 个答案:

答案 0 :(得分:3)

Apache MyFaces CODI添加windowId以支持浏览器选项卡分离的bean。 如果您使用某些CODI范围,例如@WindowScoped,@ ViewAccessScoped,CODIs @ConversationScoped,那么您将为每个浏览器选项卡获取单独的上下文实例。

假设您有一个客户关系管理应用程序。使用CODI @WindowScoped,您可以在不同的浏览器选项卡/窗口中打开不同的客户。你会使用@SessionScoped,那么你每次都会覆盖这些值(对于@SessionScoped bean,每个会话只有1个上下文实例)。

当然,您可以非常轻松地禁用此功能。请查看我们的官方WIKI: https://cwiki.apache.org/confluence/display/EXTCDI/Index

答案 1 :(得分:3)

在官方维基中找到解决方案需要一些时间。 https://cwiki.apache.org/confluence/display/EXTCDI/Index

如果您不使用@WindowScoped,@ ViewAccessScoped并确定您不需要此windowId参数,那么您可以在项目中创建这样的类:

@Specializes
@ApplicationScoped
public class CustomWindowContextConfig extends WindowContextConfig {

    @Override
    public boolean isAddWindowIdToActionUrlsEnabled() {
        return false;
    }

    @Override
    public boolean isUrlParameterSupported() {
        return false;
    }
}