2016-09-16 74 views
1

在我試圖結合的成分值到本地作用域EL變量的表的列,並稍後使用該變量作爲一個放慢參數:JSF組件,而不bean屬性結合投擲轉換錯誤

 <h:column> 
      <h:outputLabel value="Enter a quantity to put into the cart" for="qty"/> 
      <h:inputText id="qty" binding="#{qty}" converter="javax.faces.Number"/> 
     </h:column> 
     <h:column> 
      <h:commandButton value="Put into cart" type="submit" 
          action="#{shoppingCart.addToCart(product, qty)}"/> 
     </h:column> 

其中product是數據表的當前元素(未包含在購物車中的過濾或未過濾產品的列表)。

現在,當嘗試一個產品添加到購物車(例如與數量12)它拋出以下異常:

javax.faces.el.EvaluationException: java.lang.IllegalArgumentException: Cannot convert [email protected] of type class javax.faces.component.html.HtmlInputText to class java.lang.Integer 
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) 
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
at javax.faces.component.UIData.broadcast(UIData.java:1108) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
at java.lang.Thread.run(Thread.java:745) 

我使用Glassfish的4.1.1版本JSF 2.2.12。

我會很感激您的任何想法

CLARIFACATION

由於在這個問題上JSF component binding without bean property和其他人所指出的BalusC,binding="#{var}"實際上是有效的XHTML。這樣不需要支持bean,聲明的變量是請求作用域。我覺得這個選項更優雅,因此想堅持下去。

+0

爲什麼你認爲這是一個優勢,你不需要爲這個支持bean?事實上,我無法想象你在購物車中沒有'會員'字段'qty'或類似的'產品'類,所以'backing bean'已經在那裏 – Kukeltje

+0

我已經做了一個更正。它實際上是關於創建一個新的ShoppingCartItem。對不起,質疑 – Wecherowski

回答

1

代替binding="#{qty}"(應被用於將你輸入組件綁定到組件的Java實例在託管bean),用途:value="#{shoppingCart.quantityAsInteger}",或者如果你是購物車中的商品清單工作:value="#{shoppingCartItem.quantityAsInteger}"

除了正確的價值綁定,這也會給你的數量作爲你的模型的一部分的好處。此外,當value綁定到Integer時,不需要添加轉換器。 JSF將負責Integer (and some other types) conversion by default

因此,請確保您有一個託管bean,其中包含數量或每個包含數量的購物車項目列表。在車中的物品清單的情況下,你最終會喜歡的東西:

ShoppingCart.java

// You will probably already have something like this for your table 
private List<ShoppingCartItem> shoppingCartItems; 

ShoppingCartItem.java

// Quantity used for binding (add getter and setter). 
private Integer quantity; 

private Product product; 

XHTML

<h:column> 
    <h:outputLabel value="Enter a quantity to put into the cart" for="qty"/> 
    <h:inputText id="qty" binding="#{shoppingCartItem.quantity}" /> 
</h:column> 
+0

謝謝:)我不能使用binding =「#{shoppingCartItem.quantity}」,因爲目前沒有項目。我的意思是一個對象只是在點擊commandButton之後創建的,因此我無法在創建它之前爲它指定一個值。或者我錯了嗎? – Wecherowski

+0

對不起,您可以將一個數量的整數添加到'Product'以添加產品。正如你已經發現的那樣,你的問題的核心是你應該使用'value'來進行價值綁定。 –

+0

在這種情況下,使用'value =「#{product.quantity}」'和'action =「#{shoppingCart.addToCart(product)}」' –

0

嘗試使用value屬性替代binding屬性h:inputText並在表組件上使用binding屬性。通過這種方式,您可以訪問操作方法中的選定(單擊)行:如果binding表的屬性值爲#{bean.dataTable},則可以使用類似getDataTable.getRowData()的方法獲取行數據。

0

雖然聲明EL變量是有效的XHTML,但是如果使用binding屬性,則組件本身將綁定到該變量。使用與value屬性的EL變量時,沒有轉換錯誤拋出這樣的:

 <h:inputText id="qty" value="#{qty}" converter="javax.faces.Number"/> 
     .... 
     <h:commandButton value="Put into cart" type="submit" 
         action="#{shoppingCart.addToCart(product, qty)}"/> 
+0

這就是我告訴你的;-) –

+0

@JasperdeVries:不完全...在這裏他定義了一個requestScoped變量,它不是一個bean中的字段。它僅在請求期間存在。與你的例子略有不同。另見他對編輯/澄清的問題 – Kukeltje

+0

對..現在我明白了。我以爲是編輯購物車! –