2017-06-12 485 views
0

我使用JSF/Primefaces創建表單以允許用戶輸入數據。我已經定義了一個通用類Input以允許訪問數據(因爲不同的字段有不同的類型)。然而,當我嘗試和聲明爲Input<Double>對象檢索數據我得到的異常 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double使用泛型時,不能將java.lang.String強制轉換爲java.lang.Double

我有點困惑,爲什麼發生這種情況存儲在Input應該是一個雙重的價​​值?如果有人能指出我正確的方向是什麼導致了這一點,我將非常感激。

FormBean.java

@ManagedBean(name="form", eager=true) 
@SessionScoped 
public class FormBean { 

    private Input<String> name = new Input<>(); 
    private Input<Date> date = new Input<>(); 
    private Input<Double> hours = new Input<>(); 
    private Input<Double> amount = new Input<>(); 

    public void submit(){ 
     System.out.println(name.getValue()); 
     System.out.println(parseDate(date.getValue(),"dd/MM/yy")); 
     System.out.println(formatDouble(hours.getValue())); 
     System.out.println(formatDouble(amount.getValue()));  
    } 

    public static String parseDate(Date date, String format){ 
     if(date == null) return ""; 
     DateFormat df = new SimpleDateFormat(format); 
     return df.format(date); 
    } 

    public static String formatDouble(Double d){ 
     if(d==null) return ""; 
     else return String.format("%.2f", (double)d); 
    } 

    //-------------------GETTERS AND SETTERS---------------------------- 

    public Input<String> getName() { 
     return name; 
    } 
    public Input<Date> getDate() { 
     return date; 
    } 
    public Input<Double> getHours() { 
     return hours; 
    } 
    public Input<Double> getAmount() { 
     return amount; 
    } 
} 

Input.java

public class Input<T> { 

    private T value; 
    private String styleClass = "inputdefault"; 

    public T getValue() { 
     return value; 
    } 
    public void setValue(T value) { 
     this.value = value; 
    } 
    public String getStyleClass() { 
     return styleClass; 
    } 
    public void setStyleClass(String styleClass) { 
     this.styleClass = styleClass; 
    } 
} 

form.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 

    <h:head> 
     <ui:define name="title">Form</ui:define> 
    </h:head> 

    <h:body>  
      <h:form id="form"> 
       <p:panelGrid id="formGrid" style="text-align:center;margin:20px;" columns="2" layout="grid"> 
        <h:outputText class="output" value="Name"/> 
        <p:inputText id="name" class="#{form.name.styleClass}" value="#{form.name.value}"/> 

        <h:outputText class="output" value="Date:"/> 
        <p:calendar class="#{form.date.styleClass}" value="#{form.date.value}" pattern="dd/MM/yy"/> 

        <h:outputText class="output" value="Hours:"/> 
        <p:inputNumber id="hours" class="#{form.hours.styleClass}" value="#{form.hours.value}" decimalPlaces="2"/> 

        <h:outputText class="output" value="Amount:"/> 
        <p:inputNumber class="#{form.amount.styleClass}" value="#{form.amount.value}" decimalPlaces="2"/> 
       </p:panelGrid> 

       <p:commandButton value="Submit" update="@form" action="#{form.submit}" class="left"/> 
      </h:form> 
    </h:body> 

</html> 

在在FormBean.java的submit()方法的線13發生該錯誤: System.out.println(formatDouble(amount.getValue()));

如果需要任何其他信息,請讓我知道。 謝謝!

編輯:新增堆棧跟蹤:

Jun 12, 2017 1:10:55 PM com.sun.faces.lifecycle.InvokeApplicationPhase execute 
WARNING: #{form.submit}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
javax.faces.FacesException: #{form.submit}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    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.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: javax.faces.el.EvaluationException: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    ... 26 more 
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at FormBean.submit(FormBean.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) 
    ... 27 more 

Jun 12, 2017 1:10:55 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError 
SEVERE: javax.faces.el.EvaluationException: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    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.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.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Double 
    at FormBean.submit(FormBean.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) 
    ... 27 more 
+0

時轉換爲目標類型錯誤發生在哪一行? –

+0

錯誤發生在FormBean.java的submit()方法的第13行:'System.out.println(formatDouble(amount.getValue()));' –

+0

當您刪除雙重投射'else return String.format(「%。2f」,(double)d);'? –

回答

0

我認爲這個問題不能被發現的代碼撕成小塊。 在你期待異常的地方,bean只是第一次訪問bean屬性。 JSF正試圖調用Input.setValue(Double double),但是jsf控件的輸出值是一個字符串。所以我想這裏拋出異常。

要確保plz發佈異常的堆棧跟蹤。

該問題的解決方案將爲您的控件配置一個值轉換器。

http://download.oracle.com/otn_hosted_doc/jdeveloper/j2ee101302/jsf_apps/eventvalidate/sf_avc_converters.html

另一種解決辦法是將存儲原始值作爲字符串中的輸入類,它調用一個方法來獲得的轉換值(不消氣法)

+0

我已經發布了stacktrace,並且似乎只有在'submit()'方法試圖將'amount.getValue()'傳遞給'formatDouble()'接受Double的方法時,該錯誤纔會發生。我查看了PrimeFaces文檔,''返回Double。 –

相關問題