JSF - Spring Web Flow - 在嵌套的dataTables中访问“selectedRow”的问题

问题描述 投票:0回答:1

我一直在玩Spring网络流程酒店预订应用程序,并对它进行了一些扩展,以便更好地了解spring web flow和JSF如何集成在一起。弹簧文档在这个领域并不是很好,我的印象是,在你改变它们之前一切正常,然后没有明确的文档描述它是如何工作的,所以你不知道你是如何破坏它的。

无论如何,希望您熟悉spring web flow酒店预订示例应用程序。如果不是,主流程接受搜索条件并返回酒店列表,然后可以选择酒店,然后显示其信息。我正在尝试扩展它,以便当您查看酒店时,您可以查看有关各个酒店房间的信息。

这是流程的代码:

    <view-state id="reviewHotels">
    <on-render>
        <evaluate expression="bookingService.findHotels(searchCriteria, flowRequestContext)" result="viewScope.hotels" result-type="dataModel" />
    </on-render>
    <transition on="select" to="reviewHotel">
        <set name="flowScope.hotel" value="hotels.selectedRow" />
    </transition>

当您选择酒店时,它会调用定价服务。这是该观点:

<view-state id="reviewHotel" model="hotel">
    <on-render>
        <evaluate expression="bookingService.priceHotel(flowScope.hotel, flowRequestContext)" result="flowScope.hotel"/>
    </on-render>

    <transition on="price" to="displayPriceBreakdown">
        <set name="flowScope.room" value="flowScope.hotel.rooms.selectedRow"></set>
    </transition>
</view-state>

然后,displayPriceBreakdown视图显示单击酒店价格时的价格计算方式。这是视图配置:

    <view-state id="displayPriceBreakdown" view="displayPriceBreakdown.xhtml">
    <on-entry>
        <render fragments="priceBreakdownFragment" />
    </on-entry>
    <transition on="back" to="reviewHotel"/>
</view-state>

reviewHotel.xhtml显示了酒店详细信息及其客房,如下所示:

<ui:define name="content">
<div class="section">
<h2>View Hotel</h2>
<ui:fragment id="messages">
        <div id="messagesInsertionPoint">
            <h:messages errorClass="errors" />
        </div>
</ui:fragment>

<h:form id="hotel">
    <fieldset>
        <div class="field">
            <div class="labelhotel">Name:</div>
            <div class="outputhotel">#{hotel.name}</div>
        </div>
        <div class="field">
            <div class="labelhotel">Address:</div>
            <div class="outputhotel">#{hotel.address}</div>
        </div>
        <div class="field">
            <div class="labelhotel">City:</div>
            <div class="outputhotel">#{hotel.city}</div>
        </div>
        <div class="field">
            <div class="labelhotel">Post Code:</div>
            <div class="outputhotel">#{hotel.zip}</div>
        </div>
        <div class="field">
            <div class="labelhotel">Country:</div>
            <div class="outputhotel">#{hotel.country}</div>
        </div>
        <div class="field">
            <div class="labelhotel">Amenities:</div>
            <div class="outputhotel"><h:dataTable id="amentities" var="a" value="#{hotel.amenities}">
                                    <h:column>#{a.name} - #{a.description}</h:column></h:dataTable></div>
        </div>

        <div class="field">
            <div class="labelhotel">Rooms:</div>
            <ui:fragment id="roomsFragment">
            <div class="outputhotel"><h:dataTable id="rooms" styleClass="summary" var="r" value="#{hotel.rooms}">
                                    <h:column>#{r.roomType} - #{r.bedType}</h:column> 
                                    <h:column><sf:commandLink id="priceBreakdownLink" value="#{r.roomPrice} #{r.roomPriceCurrency}" action="price" processIds="priceBreakdownFragment"/> </h:column>
                                    <h:column><sf:commandLink id="bookHotelLink" value="Book Hotel" action="select"/></h:column>
                                </h:dataTable>
            </div>
            </ui:fragment>
        </div>

        <div class="buttonGroup">
            <h:commandButton id="cancel" action="cancel" value="Back to Search"/>
        </div>
    </fieldset>
</h:form>

重要的一位是用于显示酒店房间的dataTable:

            <div class="field">
            <div class="labelhotel">Rooms:</div>
            <ui:fragment id="roomsFragment">
            <div class="outputhotel"><h:dataTable id="rooms" styleClass="summary" var="r" value="#{hotel.rooms}">
                                    <h:column>#{r.roomType} - #{r.bedType}</h:column> 
                                    <h:column><sf:commandLink id="priceBreakdownLink" value="#{r.roomPrice} #{r.roomPriceCurrency}" action="price" processIds="priceBreakdownFragment"/> </h:column>
                                    <h:column><sf:commandLink id="bookHotelLink" value="Book Hotel" action="select"/></h:column>
                                </h:dataTable>
            </div>
            </ui:fragment>
        </div>

房间信息显示正确,但是当用户点击价格时,我想显示所选房间的价格细分列表。这就是我希望通过以下方式实现的目标:

        <transition on="price" to="displayPriceBreakdown">
        <set name="flowScope.room" value="flowScope.hotel.rooms.selectedRow"></set>
    </transition>

但是当我运行时,我得到了selectedRow的NumberFormatException。

HTTP Status 500 -

类型异常报告

信息

description服务器遇到内部错误(),导致无法完成此请求。

例外

org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.springframework.webflow.execution.ActionExecutionException:异常抛出执行[AnnotatedAction @ 34f67 targetAction = [SetAction @ 4db694 name = flowScope.room,value = flowScope.hotel.rooms.selectedRow,type = [null]],属性= map [[empty]]]在流'main'的'reviewHotel'中 - 动作执行属性是'map [[empty]]'org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)javax.servlet.http.HttpServlet.service(httpServlet.java:637)javax.servlet.http.HttpServlet.service(httpServlet.java:717) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)的根本原因

org.springframework.webflow.execution.ActionExecutionException:抛出执行的异常[AnnotatedAction @ 34f67 targetAction = [SetAction @ 4db694 name = flowScope.room,value = flowScope.hotel.rooms.selectedRow,type = [null]],attributes = map [ [empty]]]状态'reviewHotel'的流'main' - 动作执行属性是'map [[empty]]'org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:60)org.springframework .webflow.engine.support.ActionTransitionCriteria.test(ActionTransitionCriteria.java:82)org.springframework.webflow.engine.support.TransitionCriteriaChain.test(TransitionCriteriaChain.java:71)org.springframework.webflow.engine.Transition.canExecute(Transition .java:195)org.springframework.webflow.engine.Transition.execute(Transition.java:211)org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:391)org.springframework.webflow.engine .impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)o rg.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119)org.springframework.webflow.engine.Flow.handleEvent(Flow.java:555)org.springframework.webflow.engine.impl.FlowExecutionImpl.handleEvent( FlowExecutionImpl.java:386)org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210)org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:230)org.springframework.webflow。 engine.ViewState.resume(ViewState.java:196)org.springframework.webflow.engine.Flow.resume(Flow.java:545)org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:259) org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:163)org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)org.springframework.web.servlet.DispatcherServlet.doDispatch( DispatcherServlet.java:875)org.springframework.web.servlet.Dispatch erServlet.doService(DispatcherServlet.java:807)org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)javax.servlet。 http.HttpServlet.service(HttpServlet.java:637)javax.servlet.http.HttpServlet.service(httpServlet.java:717)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)org.springframework。 web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)根本原因

java.lang.NumberFormatException:对于输入字符串:“selectedRow”java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)java.lang.Integer.parseInt(Integer.java:449)java.lang.Integer.parseInt(Integer .java:499)javax.el.ListELResolver.coerce(ListELResolver.java:166)javax.el.ListELResolver.getValue(ListELResolver.java:51)javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)org.springframework .binding.expression.el.DefaultELResolver.getValue(DefaultELResolver.java:80)org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:53)org.jboss.el.parser.AstValue.getValue(AstValue.java :67)org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)org.springframework.binding.expression.el.BindingValueExpression.getValue(BindingValueExpression.java:54)org.springframework.binding.expression.el.E​​LExpression .getValue(ELExpression.java:54)org.springframework.webflow.action.SetAction.doExecute(SetAction.java:75)org.springframework.web flow.action.AbstractAction.execute(AbstractAction.java:188)org.springframework.webflow.execution.AnnotatedAction.execute(AnnotatedAction.java:145)org.springframework.webflow.execution.ActionExecutor.execute(ActionExecutor.java:51) org.springframework.webflow.engine.support.ActionTransitionCriteria.test(ActionTransitionCriteria.java:82)org.springframework.webflow.engine.support.TransitionCriteriaChain.test(TransitionCriteriaChain.java:71)org.springframework.webflow.engine.Transition。 canExecute(Transition.java:195)org.springframework.webflow.engine.Transition.execute(Transition.java:211)org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:391)org.springframework。 webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119)org.springframework.webflow.engine.Flow.handleEvent(Flow.java: 555)org.springframework.webflow.engine .impl.FlowExecutionImpl.handleEvent(FlowExecutionImpl.java:386)org.springframework.webflow.engine.impl.RequestControlContextImpl.handleEvent(RequestControlContextImpl.java:210)org.springframework.webflow.engine.ViewState.handleEvent(ViewState.java:230 )org.springframework.webflow.engine.ViewState.resume(ViewState.java:196)org.springframework.webflow.engine.Flow.resume(Flow.java:545)org.springframework.webflow.engine.impl.FlowExecutionImpl.resume (FlowExecutionImpl.java:259)org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:163)org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183)org.springframework.web .servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)org .springframework.web.servlet.FrameworkServlet.doPost(FR ameworkServlet.java:511)javax.servlet.http.HttpServlet.service(httpServlet.java:637)javax.servlet.http.HttpServlet.service(httpServlet.java:717)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal( CharacterEncodingFilter.java:96)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

我应该如何将Hotel Room对象传递到显示价格细分片段?

非常感谢,如果你已经走到这一步,正在阅读并理解这一点!我试图尽可能彻底,但如果需要更多信息,请告诉我。

哦是和酒店作为变量叫做房间,这是一个List并且有getRooms:List和setRooms(列表房间)方法。

jsf spring-webflow
1个回答
0
投票

这是对flowScope.hotel.rooms.selectedRow参考的EL评估的问题。

根据您的描述,flowScope.hotel.rooms引用了一个实现List接口的对象。当EL遇到这样的对象时,它假定以下引用是该列表的索引 - 所以你可以这样做:

myList[0] - 显示第0个元素。

不幸的是,当你没有整数引用时会中断,所以flowScope.hotel.rooms.selectedRow给你一个numberFormatException,因为它不能将'selectedRow'强制转换为整数。

解决方案是从列表中分离出要引用的属性。所以你的房间对象不应该实现List,而是实现getSelectedRow和getItems - 它返回迭代的实际列表。

© www.soinside.com 2019 - 2024. All rights reserved.