Jsf 会话范围控制器不工作

Jsf 会话范围控制器不工作,jsf,session,jakarta-ee,javabeans,Jsf,Session,Jakarta Ee,Javabeans,编辑: 好的,所以我试着设置一些console.write来检查发生了什么。。。我的注销脚本似乎是在导航时调用的。但除了我的注销按钮,我不会在任何地方调用它 以下是我的模板代码: <div class="navbar"> <div class="navbar-inner"> <ul class="nav"> <li class="active"><a href="#{root}index.xht

编辑: 好的,所以我试着设置一些console.write来检查发生了什么。。。我的注销脚本似乎是在导航时调用的。但除了我的注销按钮,我不会在任何地方调用它

以下是我的模板代码:

<div class="navbar">
    <div class="navbar-inner">
        <ul class="nav">
            <li class="active"><a href="#{root}index.xhtml">Home</a></li>
            <li><a href="#{root}races/list.xhtml">Races</a></li>
            <li><a href="#{root}horses/list.xhtml">Horses</a></li>
            <h:panelGroup rendered="#{memberController.logged == true}">
                <li><a href="#{root}profile/history.xhtml">History</a></li>
                <li><a href="#" onclick="#{memberController.logout()}">Logout</a></li>
            </h:panelGroup>
            <h:panelGroup rendered="#{memberController.logged == false}">
                <li><a href="#{root}users/login.xhtml">Login</a></li>
                <li><a href="#{root}users/register.xhtml">Create Account</a></li>
            </h:panelGroup>
        </ul>
    </div>
</div>
MemberBean类:

@Entity
@Table(name = "members")
public class Member implements Serializable {
    //+ Getters, setters, HashCode and equals

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private long id;
    private double money;

    @NotNull(message = "Username cannot be null")
    @Size(min = 4, message = "Username should be of minimum 4 characters")
    private String userName;

    @NotNull(message = "Password cannot be null")
    @Size(min = 4, message = "Password should be of minimum 4 characters")
    private String password;

    @PostPersist
    private void initDefault() {
        this.money = 500;
    }
}
@Stateless
public class MemberBean {

    @PersistenceContext(unitName="HorseRacingPU")
    private EntityManager em;

    public Member getMember(long id){
        return em.find(Member.class, id);
    }

    public Member getMember(String username, String password){
        TypedQuery<Member> q = em.createQuery("SELECT u FROM Member u WHERE u.userName=?1 AND u.password=?2", Member.class);
        q.setParameter(1, username);
        q.setParameter(2, password);
        return q.getSingleResult();
    }

    public List<Member> getAllMembers(){
        TypedQuery<Member> q = em.createQuery("SELECT u FROM Member u", Member.class);
        return q.getResultList();
    }

    public Member addOrUpdateMember(Member u){
        Member original = em.find(Member.class, u.getId());
        if(original == null){
            em.persist(u);
            return u;
        }else{
            return em.merge(u);
        }
    }

    public Member deleteMember(long id){
        Member original = em.find(Member.class, id);
        if(original != null){
            em.remove(original);
        }
        return original;
    }
}
@无状态
公共类成员bean{
@PersistenceContext(unitName=“HorseRacingPU”)
私人实体管理者;
公共成员getMember(长id){
返回em.find(Member.class,id);
}
公共成员getMember(字符串用户名、字符串密码){
TypedQuery q=em.createQuery(“从成员u中选择u,其中u.userName=?1,u.password=?2”,Member.class);
q、 setParameter(1,用户名);
q、 设置参数(2,密码);
返回q.getSingleResult();
}
公共列表getAllMembers(){
TypedQuery q=em.createQuery(“从成员u中选择u”,成员.class);
返回q.getResultList();
}
公共成员addOrUpdateMember(成员u){
Member original=em.find(Member.class,u.getId());
如果(原始==null){
em.persist(u);
返回u;
}否则{
返回em.merge(u);
}
}
公共成员删除成员(长id){
成员原件=em.find(Member.class,id);
如果(原始!=null){
em.remove(原件);
}
归还原件;
}
}
成员控制器类:

@SessionScoped
public class MemberController implements Serializable {

    @EJB
    private MemberBean bean;
    private String username;
    private String password;
    private Member member;
    private boolean logged = false;
// + their getters and setters

    public List<Member> getAllMembers() {
        return bean.getAllMembers();
    }

    public String login() {
        member = bean.getMember(username, password);
        if (member != null) {
            logged = true;
            return "/races/list.xhtml?faces-redirect=true";
        }
        return "/users/login.xhtml?faces-redirect=true";
    }

    public String logout() {
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
        return "/index.xhtml?faces-redirect=true";
    }

    public void checkLogin(ComponentSystemEvent e) {
        if (!logged) {
            FacesContext context = FacesContext.getCurrentInstance();
            ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler();
            handler.performNavigation("/users/login.xhtml?faces-redirect=true");
        }
    }

    public Member getMember() {
        return member;
    }

    public void submit() {
        bean.addOrUpdateMember(member);
    }
}
@SessionScoped
公共类MemberController实现可序列化{
@EJB
私家菜豆;
私有字符串用户名;
私有字符串密码;
私人会员;
私有布尔值=false;
//+他们的能手和二传手
公共列表getAllMembers(){
返回bean.getAllMembers();
}
公共字符串登录(){
member=bean.getMember(用户名、密码);
如果(成员!=null){
记录=真;
返回“/races/list.xhtml?faces redirect=true”;
}
返回“/users/login.xhtml?faces redirect=true”;
}
公共字符串注销(){
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
返回“/index.xhtml?faces redirect=true”;
}
公共无效检查登录(组件SystemEvent e){
如果(!已记录){
FacesContext context=FacesContext.getCurrentInstance();
ConfigurableAvigationHandler=(ConfigurableAvigationHandler)context.getApplication().getNavigationHandler();
handler.performNavigation(“/users/login.xhtml?faces redirect=true”);
}
}
公共成员getMember(){
返回成员;
}
公开作废提交(){
addOrUpdateMember(成员);
}
}
我得到的主要错误如下:

信息:处理试图重置响应的错误时发生异常

可在此处找到更具体的详细信息错误:

所以当我登录时,一切都很好。当我导航到另一个url(在转发到/races/list之后)时,我就会注销。使用checkLogin()时会显示错误本身:


我不确定这是否相关,但当我在没有任何演示数据(或使用错误凭据)的情况下登录时,我会得到一个评估异常,并且无法检索任何实体。 详情如下:

这会是什么?我搔了3天的头,似乎到处都找不到问题。

这个

<li><a href="#" onclick="#{memberController.logout()}">Logout</a></li>
但是,在您的特定情况下,实际上是执行注销并返回字符串值
/index.xhtml?faces redirect=true
。因此,生成的HTML最终是

<li><a href="#" onclick="/index.xhtml?faces-redirect=true">Logout</a></li>
  • 这是无效的JS代码。但这不是主要问题:用户未单击链接就已注销

    您需要一个完整的JSF命令组件。例如,

  • 此方法仅在实际单击链接时调用,这正是您所需要的。

    <li><a href="#" onclick="#{memberController.logout()}">Logout</a></li>
    
    但是,在您的特定情况下,实际上是执行注销并返回字符串值
    /index.xhtml?faces redirect=true
    。因此,生成的HTML最终是

    <li><a href="#" onclick="/index.xhtml?faces-redirect=true">Logout</a></li>
    
  • 这是无效的JS代码。但这不是主要问题:用户未单击链接就已注销

    您需要一个完整的JSF命令组件。例如,


  • 此方法仅在实际单击链接时调用,这正是您所需要的。

    欢迎使用StackOverflow。请阅读FAQ中的部分并重写您的问题,否则它将被关闭(可能被否决)。我已经阅读了它,但似乎看不出我的问题有什么问题。我知道有2个以上的链接,但这是为了确保文本不会太长,人们可以真正组织他们的标签来查看代码,而不是上下滚动几次。这就是问题所在:你必须编写问题中的所有相关代码,而不要指向显示代码的外部链接。尽量将代码最小化,以便我们能够理解并帮助您。请记住,这个网站是免费提供建议的,而不是一个JavaEE支持团队,他们会不惜一切代价满足您的需求。谢谢您的提醒,我希望这个编辑可以修复它。不过,我确实将错误详细信息作为链接包含在内,但对我认为可能的错误给出了一个小的总结。为了减少代码量,我删除了所有导入、getter和setter,但在评论中这样说。K我编辑了我的帖子,因为似乎在导航(登录时)之后调用了注销脚本欢迎使用StackOverflow。请阅读FAQ中的部分并重写您的问题,否则它将被关闭(可能被否决)。我已经阅读了它,但似乎看不出我的问题有什么问题。我知道有两个以上
    <li><h:form><h:commandLink value="Logout" action="#{memberController.logout()}"/></h:form></li>