2017-06-12 10 views
0

JSF/Primefacesを使用してフォームを作成して、ユーザーがデータを入力できるようにしています。データへのアクセスを許可する汎用クラスInputを定義しました(異なるフィールドには異なる型があるため)。私は例外 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Doubleジェネリックの使用時にjava.lang.Doubleにjava.lang.Doubleをキャストできません

を取得しようとするとInput<Double>として宣言されたオブジェクトからデータを取得する場合しかし、私はInputに格納された値がダブルである必要があり、これが起こっている理由として、やや混乱していますか?これを引き起こしていることを誰かが正しい方向に向けることができたら、私はとても感謝しています。

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

form.xhtml

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

エラーがFormBean.javaでsubmit()方法でライン13で生じます。 System.out.println(formatDouble(amount.getValue()));

追加情報が必要な場合はお知らせください。 ありがとう!

EDIT:追加スタックトレース:

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 String.format("%2f "、(double)d);'を返す。 –

答えて

0

私はこの問題は、コードの個展に出せるで見つけることができないと思います。 例外が予想される時点で、Beanは最初にBean属性にアクセスします。 JSFがInput.setValue(Double double)を呼び出そうとしていますが、jsfコントロールの値は文字列です。だから私は例外がスローされたと思う。

pltが例外のスタックトレースを送信することを確認してください。

この問題の解決方法は、コントロール用の値コンバータを構成することです。別の解決策は、あなたの入力クラスに文字列として生の値を格納し、変換された値(ないゲッターメソッド)を取得するためのメソッドを呼び出すときにターゲット型に変換することです

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

+0

stacktraceを掲示しましたが、 'submit()'メソッドが 'amount.getValue()'をDoubleを受け入れる 'formatDouble()'メソッドに渡そうとすると、エラーが発生したようです。私はPrimeFacesのドキュメントを見て、 ''はDoubleを返します。 –

関連する問題