Как CDI bean vs Managed bean - PullRequest
       85

Как CDI bean vs Managed bean

0 голосов
/ 13 февраля 2019

У меня есть предыдущий опыт работы с 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>

Итак, вот мои вопросы:

  1. Почему именно ошибка WELD-001303 возникает в WebFilter при изменении бина входа с управляемого на CDI?

  2. Почему яm Я не могу получить доступ к свойству username из моего бина Login на других страницах, когда бин управляется, в то время как он работает, как и ожидалось, когда я изменяю бин на CDI?

  3. Почему происходит вход в системуbean генерирует ошибку WELD-000227, когда я изменяю исходный код, которого нет даже в файле Login.java?

  4. Как исправить эти ошибки?

Любая помощь будет высоко оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...