Jsf 会话启动后未更新ConversationScope值

Jsf 会话启动后未更新ConversationScope值,jsf,cdi,conversation-scope,Jsf,Cdi,Conversation Scope,我有一个jsf页面,它有两个部分:一个显示记录列表的表和一个添加新记录的对话框。我添加了一些验证功能,但无法使它们正常工作。 我需要它: 1) 第一次显示对话框时,验证错误不会出现 2) 如果发生任何验证错误,请保持打开状态并显示错误消息 3) 如果没有验证错误且后端成功执行,则更新该表 这就是我所拥有的: <h:body> <h:form id="form01"> <p:dataTable id="tbl1" value="#{welcomeControl

我有一个jsf页面,它有两个部分:一个显示记录列表的表和一个添加新记录的对话框。我添加了一些验证功能,但无法使它们正常工作。 我需要它:

1) 第一次显示对话框时,验证错误不会出现

2) 如果发生任何验证错误,请保持打开状态并显示错误消息

3) 如果没有验证错误且后端成功执行,则更新该表

这就是我所拥有的:

<h:body>
<h:form id="form01">
    <p:dataTable id="tbl1" value="#{welcomeController.teams}" var="team" >
        <p:column headerText="Id">
            <h:outputText value="#{team.seq}" />
        </p:column>
        <p:column headerText="Name">
            <h:outputText value="#{team.name}" />
        </p:column>
    </p:dataTable>

    <p:dialog id="teamDialog" closable="false" visible="#{welcomeController.addMode}"
            widgetVar="teamDialog_w" modal="true" resizable="false" draggable="true" 
            header="New Team Detail">
        <p:messages />
        <p:panelGrid columns="2">
            <h:outputText value="Name" />
            <p:inputText id="name" value="#{welcomeController.newTeam.name}" />
        </p:panelGrid>
        <p:commandButton value="Submit" ajax="true" actionListener="#{welcomeController.addNewTeam}" 
            update=":form01"oncomplete="teamDialog_w.hide(); console.log(args);" />
    </p:dialog>

    <p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" 
            oncomplete="teamDialog_w.show(); console.log(args);" update="teamDialog" />

</h:form>

豆子:

@Named
@ConversationScoped
public class WelcomeController implements Serializable {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private static final long serialVersionUID = 1L;

    private List<TeamDto> teams;

    @Inject SessionManager sessionMan;
    @Inject DatabaseUtil dbCache;
    @Inject TeamService teamService;
    @Inject Conversation conversation;

    private TeamDto newTeam = new TeamDto();

    private boolean addMode = false;

    public List<TeamDto> getTeams() throws IOException {
        if (teams == null || teams.size() == 0) {
            teams = teamService.getAll();
        }
        return teams;
    }

    public void setTeams(List<TeamDto> teams) {
        this.teams = teams;
    }

    public void reload() {
        conversationBegin();
    }

    public void conversationBegin() {
        if (conversation.isTransient()) {
            conversation.begin();
        }
    }

    public void conversationEnd() {
        if(!conversation.isTransient()){
            conversation.end();
        }
    }

    public void startAdd() {
        reload();
        newTeam = new TeamDto();
        addMode = true;
    }

    public TeamDto getNewTeam() {
        return newTeam;
    }

    public void setNewTeam(TeamDto newTeam) {
        this.newTeam = newTeam;
    }

    public void addNewTeam() throws IOException, ValidatorException {
        if (newTeam.getName().isEmpty()) {
            sessionMan.addGlobalMessageFatal("INVALID INFO", null);
            return;
        }
        teamService.addTeam(newTeam);
        teams.add(newTeam);
        newTeam = new TeamDto();
        addMode = false;
    }

    public boolean isAddMode() {
        return addMode;
    }

    public void setAddMode(boolean addMode) {
        this.addMode = addMode;
    }
}
@Named
@会话范围
公共类WelcomeController实现可序列化{
私有最终记录器Logger=LoggerFactory.getLogger(this.getClass());
私有静态最终长serialVersionUID=1L;
私人名单小组;
@注入SessionManager sessionMan;
@注入DatabaseUtil-dbCache;
@注入TeamService TeamService;
@注入对话;
private TeamDto newTeam=新TeamDto();
私有布尔addMode=false;
public List getTeams()引发IOException{
if(teams==null | | teams.size()==0){
teams=teamService.getAll();
}
返回队;
}
公共医疗队(名单小组){
这个。团队=团队;
}
公共空间重新加载(){
会话开始();
}
public void会话开始(){
if(conversation.isTransient()){
对话。开始();
}
}
公共无效会话结束(){
如果(!conversation.isTransient()){
会话结束();
}
}
公共无效开始日期(){
重新加载();
newTeam=newteamdto();
addMode=true;
}
公共团队到getNewTeam(){
返回新团队;
}
公共无效设置新团队(团队到新团队){
this.newTeam=newTeam;
}
public void addNewTeam()引发IOException、ValidatorException{
if(newTeam.getName().isEmpty()){
addGlobalMessageFatal(“无效信息”,null);
回来
}
teamService.addTeam(newTeam);
团队。添加(新团队);
newTeam=newteamdto();
addMode=false;
}
公共布尔值isAddMode(){
返回addMode;
}
public void setAddMode(布尔addMode){
this.addMode=addMode;
}
}
我这里有两个问题:

1) 在我提交一个空字符串之后,我希望对话框仍然打开(因为addMode是true),但它不是。为什么

2) 如果我像这样放置“添加”按钮:

<p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" oncomplete="teamDialog_w.show(); console.log(args);" >
    <f:ajax render="teamDialog" />
</p:commandButton>
<p:commandButton value="ADD"
            actionListener="#{welcomeController.startAdd()}"
            oncomplete="if (args &amp;&amp; !args.validationFailed){PF('teamDialog').hide();}"
            update="your_dialog_formID:messages, other_updated_IDs" />

至少当我再次打开对话框时,我可以看到错误消息。但是在我的代码中,我看不到错误消息。为什么会这样?它们不是相等的吗

我的理解有什么问题吗


请帮忙。非常感谢。

对话框应该在JSF中以自己的形式运行,这一点至关重要

要防止对话框在验证时关闭,可以在Primefaces中使用:

if(args&;
!args.validationFailed){PF('eventDialog').hide();}

像这样:

<p:commandButton value="ADD" actionListener="#{welcomeController.startAdd}" oncomplete="teamDialog_w.show(); console.log(args);" >
    <f:ajax render="teamDialog" />
</p:commandButton>
<p:commandButton value="ADD"
            actionListener="#{welcomeController.startAdd()}"
            oncomplete="if (args &amp;&amp; !args.validationFailed){PF('teamDialog').hide();}"
            update="your_dialog_formID:messages, other_updated_IDs" />

这里
if(args&;!args.validationFailed){PF('teamDialog').hide();}
您可以直接添加else子句并执行#3“如果没有验证错误且后端执行成功,则更新表。”

在这里,BalusC对原因进行了详细解释: