java - 更新 spring webflow 中的对象未显示在 UI 上

标签 java spring ejb javabeans spring-webflow

我真的很困惑,因为我对这整个主题还很陌生。我目前正在使用 spring webflow 开发一个项目。在我的网络界面中,用户必须输入存储在 bean 中的用户名。

表格:

  <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"/> 

根据bean:

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;
    }

为了更新 bean 的值,我将 bean 对象转发给其他一些类

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

当我尝试打印出 bean 对象的变量值时

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,这是每个 Broker 的 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 有两个不同的实例,但我不确定为什么。我想我必须在我的 bean 中使用一些注释,但我不确定是哪一个。

我需要做什么才能让这个场景运行?

最佳答案

您的 SWF servlet 是否包含“component-scan”标签?如果是,这将导致 bean 被扫描两次:首先是在根 Web 应用程序上下文中,然后是在 SWF servlet 上下文中。您的流程操作将引用 SWF-servlet bean 实例,但 JSF EL 表达式将位于主应用程序上下文中。

对于 MVC/SWF,建议只扫描 servlet 上下文中的 @Controller bean。看 Why DispatcherServlet creates another application context?

关于java - 更新 spring webflow 中的对象未显示在 UI 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362902/

相关文章:

java - EJB - 如何将复杂对象传输到表示层?

java - Spring Boot,Mockito,将模拟注入(inject)作用域 session bean

java - 执行返回第一项后无限滚动

java - 我如何告诉用户他们之前输入过带有indexOf的字母? java

java - MVC 架构 DTO/模型映射/转换

java - Jersey 2.22 UnsatisfiedDependencyException

java - java中如何通过父类(super class)实例调用子类方法?

java - Spring 4.0.1 + quartz 1.5.2

java - 使用 Spring + Thymeleaf 时出现 java.lang.StackOverflowError

java - 在 JBoss 7.1.1 中使用 EJB 3.1 调用 Struts 2 Action 时获得 Struts 报告