Как внедрить bean-компонент CDI SessionScoped в bean-компонент RequestScoped - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь написать простую форму входа в систему с jsf и CDI. проблема в том, что когда я внедряю свой компонент SessionScoped, он не работает так, как я ожидаю. Это мой боб

@Named
@SessionScoped
public class LoginInfo implements Serializable {
    private String uname;
    private String pass;
    private String pagename;
    private int count;

    public LoginInfo() {
    }

    public void increment() {
        count++;
    }
}

А это мой контроллер:

@Named
@RequestScoped
public class LoginPageMg {
    @Inject
    LoginInfo lo;

    public LoginPageMg() {
    }


    public void login() {
        lo.increment();
        lo.setPagename("aaa");
        int x = 8;
    }
}

И простая форма Jsf, которая вызывает функцию входа в систему и показывает поле счетчика класса LoginInfo.

<h:form prependId="false" id="mainform" styleClass="login-box">
                        <p:inputText value="#{loginPageMg.uname}"/>
                        <p:password value="#{loginPageMg.pass}"/>

                        <h:outputLabel id="counter" value="#{loginInfo.count}"></h:outputLabel>

                        <p:commandButton update="counter"
                                         action="#{loginPageMg.login}"
                                         value="login"></p:commandButton>
</h:form>

При нажатии кнопки входа в систему и отладки переменных я вижу, что «lo» выглядит примерно так:

lo = {LoginInfo $ Proxy $ _ $$ _ WeldClientProxy @ 16688} "com.mg.LoginInfo@703ec5d5"

В строке int x = 8 я вижу, что переменные "lo" вообще не изменились, но на моей странице jsf я вижу, что счетчик увеличивается каждый раз, когда я нажимаю кнопку входа в систему, и бин сохраняет значение после обновления страницы.

  1. Что такое WeldClientProxy?
  2. Почему существуют два разных экземпляра компонента SessionScoped? Является это нормально или я что то не так делаю?
  3. Как я могу внедрить тот же экземпляр, что делает jsf?

Я использую Wildfly 15 Jsf 2.3.4 CDI 1.1

1 Ответ

2 голосов
/ 14 марта 2019

Я использую Wildfly 15 Jsf 2.3.4 CDI 1.1

WildFly 15 означает совместимость с EE 8, следовательно, поставляется с CDI 2.0.

Теперь, чтобы ответитьнасколько я могу из ваших вопросов:

Что такое WeldClientProxy?

Weld - это эталонная реализация CDI, используемая большинством серверов EE, включая WildFly.WeldClientProxy является внутренней конструкцией, которую он использует для инъекции bean-компонентов с нормальной областью действия (почти все, кроме @Dependent).Это не фактический экземпляр компонента, вы можете думать о нем как о «обертке», которая знает, как извлечь фактический контекстный экземпляр и делегирует ему вызовы.Таким образом, вы можете повторно использовать экземпляр прокси, все еще указывая на правильный экземпляр под капотом (следовательно, ссылка не нуждается в изменении).

Почему существует два разных экземпляра компонента SessionScoped?Это нормально или я что-то не так делаю?

Есть только один, прокси клиента не является действительным экземпляром.Вы в основном убедились, что, наблюдая увеличение count каждый раз и сохраняя состояние между запросами.

Как я могу внедрить тот же экземпляр, что делает jsf?

JSF не делаетна самом деле ничего не вводит, вместо этого он использует язык выражений, чтобы найти компонент на основе его имени.CDI позволяет вам определить это имя через @Named.Затем JSF использует тот же компонент, который вы вводите, снова через прокси.

...