Jsf java.lang.ClassCastException:com.rdb.entities.TblStaff不能强制转换为com.rdb.beans.UserManagedBean

Jsf java.lang.ClassCastException:com.rdb.entities.TblStaff不能强制转换为com.rdb.beans.UserManagedBean,jsf,primefaces,servlet-filters,Jsf,Primefaces,Servlet Filters,我在尝试为我的JSF PrimeFaces web应用程序使用登录过滤器时遇到了一些问题 以下是stacktrace: WARNING: StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception java.lang.ClassCastException: com.rdb.entities.TblStaff cannot be cast to com.rdb.

我在尝试为我的JSF PrimeFaces web应用程序使用登录过滤器时遇到了一些问题

以下是stacktrace:

WARNING:   StandardWrapperValve[Faces Servlet]: Servlet.service() for servlet Faces Servlet threw exception
java.lang.ClassCastException: com.rdb.entities.TblStaff cannot be cast to com.rdb.beans.UserManagedBean
    at com.rdb.filter.AuthorizationFilter.doFilter(AuthorizationFilter.java:50)
授权筛选器类:

public class AuthorizationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    UserManagedBean auth = (UserManagedBean) req.getSession().getAttribute("staff");

    if (auth != null && auth.isLoggedIn()) {
        chain.doFilter(request, response);
    } else {
        HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect(req.getContextPath() + "/frontend/login.xhtml?faces-redirect=true");
    }
}
}

我的登录本

@ManagedBean
@SessionScoped
public class UserManagedBean extends TblStaff implements Serializable {

    private TblStaff staff = null;
    private String currentLogin;
    private String username;
    private String password;
    private boolean loggedIn;
    private ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();

    @ManagedProperty(value="#{navigationBean}")
    private NavigationBean navigationBean;

    /**
     * Creates a new instance of UserManagedBean
     *
     */
    public UserManagedBean() {
        super();
    }

    public String login() {
        int isValid = doLogin();

        if (isValid == 1) {
            StaffBLL staffBLL = new StaffBLL();
            staff = staffBLL.getStaffByUsername(username);
            setSession("staff", staff);
            String destinationUrl = null;

            if (staff.getRoleId() == 1) {
                loggedIn = true;
                setCurrentLogin("admin");
                destinationUrl = navigationBean.redirectToBackend();
            } else if (staff.getRoleId() == 2) {
                loggedIn = true;
                setCurrentLogin("manager");
                destinationUrl = navigationBean.redirectToManager();
            } else if (staff.getRoleId() == 3) {
                loggedIn = true;
                setCurrentLogin("faculty");
                destinationUrl = navigationBean.redirectToFaculty();
            }

            return destinationUrl;
        } else {
            return navigationBean.toLogin();
        }
    }

    /**
     * Set new session if try to logged in
     * 
     * @param key
     * @param value
     */
    public static void setSession(String key, Object value) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        session.setAttribute(key, value);
    }

    /**
     * Get session if logged in
     * 
     * @param key
     * @return Session
     */
    public static Object getSession(String key) {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        return session.getAttribute(key);
    }

    public String logout() {
        loggedIn = false;
        ec.invalidateSession();
        setCurrentLogin(null);

        return navigationBean.toFrontend();
    }

    public void logoutAdmin(ActionEvent actionEvent) throws IOException {
        loggedIn = false;
        ec.invalidateSession();
        setCurrentLogin(null);

        ec.redirect(ec.getRequestContextPath() + "/frontend/index.xhtml?faces-redirect=true");
    }

    public int doLogin() {
        CallableStatement objCall;
        SHAConverter hash = new SHAConverter();
        int result = -1;
        String[] params = new String[3];
        params[0] = username;
        params[1] = hash.hashBasic(password);
        params[2] = null;

        try {
            objCall = SQLHelper.execute("procLogin", params);
            result = objCall.getInt("Result");
        } catch (Exception ex) {
            System.out.println("Error: " + ex.getMessage());
        }

        return result;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public void setUsername(String username) {
        this.username = username;
    }

    public String getCurrentLogin() {
        return currentLogin;
    }

    public void setCurrentLogin(String currentLogin) {
        this.currentLogin = currentLogin;
    }

    public boolean isLoggedIn() {
        return loggedIn;
    }

    public void setLoggedIn(boolean loggedIn) {
        this.loggedIn = loggedIn;
    }

    public void setNavigationBean(NavigationBean navigationBean) {
        this.navigationBean = navigationBean;
    }
}
和导航bean

@ManagedBean
@SessionScoped
public class NavigationBean implements Serializable {

//    private static final long serialVersionUID = 1520318172495977648L;

    /**
     * Redirect to login page.
     *
     * @return Login page name.
     */
    public String redirectToLogin() {
        return "/frontend/login.xhtml?faces-redirect=true";
    }

    /**
     * Go to login page.
     *
     * @return Login page name.
     */
    public String toLogin() {
        return "/frontend/login.xhtml";
    }

    /**
     * Redirect to backend.
     *
     * @return Backend page name.
     */
    public String redirectToBackend() {
        return "/backend/AdminHome.xhtml?faces-redirect=true";
    }

    /**
     * Go to backend page.
     *
     * @return Backend page name.
     */
    public String toBackend() {
        return "/backend/AdminHome.xhtml";
    }

    /**
     * Redirect to faculty.
     *
     * @return Faculty page name.
     */
    public String redirectToFaculty() {
        return "/frontend/faculty/index.xhtml?faces-redirect=true";
    }

    /**
     * Go to faculty.
     *
     * @return Faculty page name.
     */
    public String toFaculty() {
        return "/frontend/faculty/index.xhtml";
    }

    /**
     * Redirect to manager.
     *
     * @return Manager page name.
     */
    public String redirectToManager() {
        return "/frontend/manager/index.xhtml?faces-redirect=true";
    }

    /**
     * Go to manager.
     *
     * @return Manager page name.
     */
    public String toManager() {
        return "/frontend/manager/index.xhtml";
    }

    /**
     * Redirect to frontend.
     *
     * @return Frontend page name.
     */
    public String redirectToFrontend() {
        return "/frontend/index.xhtml?faces-redirect=true";
    }

    /**
     * Go to frontend page.
     *
     * @return Frontend page name.
     */
    public String toFrontend() {
        return "/frontend/index.xhtml";
    }
}
stacktrace告诉我不能将实体强制转换为bean,但我必须在登录bean中扩展
TblStaff


有人能给我一个解决办法吗?

嗯?这实在毫无意义。为什么不直接使用
req.getSession().getAttribute(“userManagedBean”)
?然后您可以省略
setSession(“staff”,staff)胡说八道。
UserManagedBean
本身已经是一个会话范围的托管bean。谢谢@BalusC。你的意思是我应该将if
(auth!=null&&auth.isLoggedIn())
替换为if
if(req.getSession().getAttribute(“userManagedBean”)!=null)
?将其分配给
auth
。您还需要
isLoggedIn()
方法,对吗?试着逻辑思考。@BalusC:嗯,这是我的问题。因为它将向我显示一个错误:不能将实体强制转换为bean。