обновление объекта в весеннем веб-потоке, не отображаемом в пользовательском интерфейсе - PullRequest
2 голосов
/ 03 декабря 2011

Я действительно запутался, потому что я довольно новичок во всей этой теме. В настоящее время я занимаюсь разработкой проекта с использованием Spring Webflow. В моем веб-интерфейсе пользователь должен ввести имя пользователя, которое хранится в бине.

Форма:

  <fieldset>
       <legend>User Details</legend>
       <h:outputText value="Please enter the Name for your Broker:    " />
       <h:inputText id="brokerName" value="#{brokerBean.brokerName}"/>
       <h:outputText value="Please enter the password for your Broker: " />
       <h:inputSecret id="password" value="#{brokerBean.password}"/>
    </fieldset>
    <p:commandButton value="Register Broker" action="register" ajax="false"/> 

Соответствующий компонент:

public class HumanBrokerBean  implements Serializable{

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = 1L;

    /** The broker name. */
    private String brokerName;

    /** The password. */
    private String password;

    private double cashPosition = 0;

    ... getters & setters...

После ввода имени пользователя пользователь перенаправляется на следующую страницу, где его текущие cashPosition должны отображаться и обновляться каждые 5 секунд, потому что значение могло измениться (это можно было сделать с помощью опроса PrimeFaces). Пока это работает.

Когда пользователь ввел свое имя пользователя и некоторые другие значения, он нажимает кнопку и запускается переход соответствующего потока.

<view-state id="view">
        <transition on="register" to="mainpage">    
            <evaluate expression="brokerBean.checkCredentials(flowRequestContext)" />
            <evaluate expression="connectionBean.connect(brokerBean.brokerName, brokerBean.password, brokerBean)" /> 
        </transition>
    </view-state>

И метод ConnectionBean:

public boolean connect(String username, String password, HumanBrokerBean brokerBean){

        ConnectionService connection = new ConnectionService();
        //if there have been problems while establishing the connection
        if(!connection.connect(username, password, this.serverConnection, byPass, brokerBean)){
            return false;
        }
        //if connection was established
        return true;
    }

Чтобы обновить значения компонента, я перенаправил объект компонента в другой класс

public class ConnectionService {
    public boolean connect (String username, String password, String serverURL,
        boolean bypass, HumanBrokerBean brokerBean){ ....
    }
}

Когда я пытаюсь распечатать значения переменных объекта EJB с

System.out.println("Brokername :"+brokerBean.getBrokerName())

Я получаю правильные результаты. Когда я сейчас пытаюсь обновить cashPosition с

brokerBean.setCashPosition();

Правильный результат не отображается в моем опросном разделе веб-интерфейса. Начальное значение ноль возвращается всегда.

Как упомянуто выше, я реализовал функцию опроса с помощью Primefaces-poll, который использует AJAX.

<h:form>  
    <h:outputText id="txt_cash" value="#{brokerBean.cashPosition}" />  
    <p:poll interval="3" update="txt_cash" />  
</h:form> 

А ответ AJAX, который я всегда получаю ... всегда возвращает 0.0, что является начальным значением cashPosition каждого брокера ...

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><changes><update id="j_idt16:txt_cash"><![CDATA[<span id="j_idt16:txt_cash">0.0</span>]]></update><update id="javax.faces.ViewState"><![CDATA[e1s2]]></update></changes><extension primefacesCallbackParam="validationFailed">{"validationFailed":false}</extension></partial-response>

Для меня это означает, что есть два разных экземпляра моего BrokerBean, но я не уверен почему. Я думаю, что мне придется использовать некоторую аннотацию в моем бобе, но я не уверен, какая именно.

Что мне нужно сделать, чтобы запустить этот сценарий?

1 Ответ

0 голосов
/ 18 января 2013

Содержит ли ваш SWF-сервлет тег «компонент-сканирование»? Если да, это приведет к тому, что bean-компоненты будут сканироваться дважды: сначала в контексте корневого веб-приложения, затем в контексте сервлета SWF. Ваши действия потока будут ссылаться на экземпляр компонента SWF-сервлета, но выражения JSF EL будут в основном контексте приложения.

Для MVC / SWF рекомендуется проверять только bean-компоненты @Controller в контексте сервлета. Увидеть Почему DispatcherServlet создает другой контекст приложения?

...