Jsf java.lang.ClassCastException:com.rdb.entities.TblStaff不能强制转换为com.rdb.beans.UserManagedBean
我在尝试为我的JSF PrimeFaces web应用程序使用登录过滤器时遇到了一些问题 以下是stacktrace: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.
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())
替换为ifif(req.getSession().getAttribute(“userManagedBean”)!=null)
?将其分配给auth
。您还需要isLoggedIn()
方法,对吗?试着逻辑思考。@BalusC:嗯,这是我的问题。因为它将向我显示一个错误:不能将实体强制转换为bean。