У меня есть предыдущий опыт работы с Java SE, и я только что решил изучать JSF.Я работаю с JSF 2.2, Apache Netbeans 10, glassfish 5 / paraya 5.184.Проблема в том, что у меня был ряд проблем, связанных с компонентами CDI и ManagedBeans
. После обучения в Интернете я смог создать имя входа с использованием страниц входа WebFilter
и JSF.основанный на SessionScoped
ManageBean
.
Однако я не могу получить доступ к свойству bean-компонента (например, вошел в систему с именем пользователя) с других страниц JSF, и изменение Bean-компонента на CDI-компонент (javax.inject.Named
) решило эту проблему (следовательно, свойства теперь доступныс других страниц), но создал другой.Время от времени я получаю ошибку WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
, которая не возникает, когда контроллером входа был javax.faces.bean.ManagedBean
.Обратите внимание, что эта ошибка генерируется именно из WebFilter
, когда вызывается метод doFilter
.
Также часто во время процесса разработки я получаю WELD-000227: Bean identifier index inconsistency detected - the distributed container probably does not work with identical applications Expected hash: -XXXXXXXXX
.Хотя я обычно решаю эту проблему, удаляя бит implements Serializable
моего компонента входа в систему, затем развертывая и затем добавляя его обратно перед повторным развертыванием (это легко сделать благодаря функции автоматического развертывания Netbean)
login.xhtml
<h:body>
<h:form>
<h3>User Login</h3>
<h:panelGrid columns="3"
columnClasses="rightalign,leftalign,leftalign">
<h:outputText value="Username" />
<h:inputText id="username"
label="Username"
required="true"
value="#{login.user}" />
<h:message for="username"/>
<h:outputText value="Password" />
<h:inputSecret id="password"
label="Password"
required="true"
value="#{login.pwd}" />
<h:message for="password"/>
<h:panelGroup/>
<h:commandButton action="#{login.validateUsernamePassword}"
id="login" value="Login" />
</h:panelGrid>
</h:form>
</h:body>
Login.java
@ManagedBean //This error occurs if I change it to @Named --> WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
@SessionScoped
public class Login implements Serializable {
private static final long serialVersionUID = 1897831825228386363L;
private String pwd;
private String msg;
private String user;
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
//validate login
public String validateUsernamePassword() {
boolean valid = LoginDAO.validate(user, pwd);
if (valid) {
HttpSession session = SessionUtils.getSession();
session.setAttribute("username", user);
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("explorer.xhtml");
} catch (IOException ex) {
Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
}
return "explorer";
} else {
FacesContext.getCurrentInstance()
.addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_WARN,
"Incorrect Username and Passowrd",
"Please enter correct username and Password"));
return "login";
}
}
//logout event, invalidate session
public String logout() {
HttpSession session = SessionUtils.getSession();
session.invalidate();
return "login";
}
}
AuthorizationFilter.java
@WebFilter("/*")
public class AuthorizationFilter implements Filter {
public AuthorizationFilter() {
}
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest reqt = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpSession ses = reqt.getSession(false);
String reqURI = reqt.getRequestURI();
if (reqURI.indexOf("/login.xhtml") >= 0
|| (ses != null && ses.getAttribute("username") != null)
|| reqURI.indexOf("/public/") >= 0
|| reqURI.contains("javax.faces.resource"))
// this causes the WELD-001303 error
chain.doFilter(request, response);
//Logger.getLogger(this.getClass().getName()).log(Logger.Level.INFO, "doChain");
else
{
resp.sendRedirect(reqt.getContextPath() + "/faces/login.xhtml");
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void destroy() {
}
}
admin.xhtml
<!--admin.xhtml-->
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<p>Welcome #{login.user}</p>
<h:commandLink action="#{login.logout}" value="Logout"></h:commandLink>
</h:form>
</h:body>
</html>
Итак, вот мои вопросы:
Почему именно ошибка WELD-001303 возникает в WebFilter
при изменении бина входа с управляемого на CDI?
Почему яm Я не могу получить доступ к свойству username из моего бина Login на других страницах, когда бин управляется, в то время как он работает, как и ожидалось, когда я изменяю бин на CDI?
Почему происходит вход в системуbean генерирует ошибку WELD-000227, когда я изменяю исходный код, которого нет даже в файле Login.java?
Как исправить эти ошибки?
Любая помощь будет высоко оценена.