2010-12-28 3 views
0

をスローは、Wicketの1.4.7
のためにそして例に書かれている:なぜ((整数)weightModel.getObject())。intValue(); book.It "ウィケットによるWeb開発を楽しむ" ことで、私は自動改札を勉強例外

int weight = ((Integer) weightModel.getObject()).intValue();

が使用されています。 それは予期しないのRuntimeException最初の行スローボタンSubmitをクリックした場合:

WicketMessage:コンポーネントをターゲットorg.apache.wicket.markup.html.form.IFormSubmitListenerインタフェースのメソッドonFormSubmittedを[MarkupContainer [部品ID =フォームを]投げ例外

根本的な原因:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer* 

おそらくweightModel.getObject()がStringにを変換できませんでした。

完全例外メッセージが下部にあります。

しかしにコードを変更した後:それは正常に動作します

int weight=Integer.parseInt((String) weightModel.getObject());

。それはうまく動作するはずです。例外をスローする理由はとは何ですか?


フルコード:

GetRequest.java

package myapp.postage; 
import java.util.HashMap; 
import java.util.Map; 

import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.form.Form; 
import org.apache.wicket.markup.html.form.TextField; 
import org.apache.wicket.model.Model; 

@SuppressWarnings("unchecked") 
public class GetRequest extends WebPage { 
private Model weightModel=new Model(); 
private Model patronCodeModel=new Model(); 
private Map patronCodeToDiscount; 

public GetRequest(){ 
    patronCodeToDiscount=new HashMap(); 
    patronCodeToDiscount.put("p1", new Integer(90)); 
    patronCodeToDiscount.put("p2", new Integer(95)); 

    Form form=new Form("form"){ 
    @Override 
    protected void onSubmit(){ 
    int weight = ((Integer) weightModel.getObject()).intValue(); 
    Integer discount=(Integer)patronCodeToDiscount.get(patronCodeModel.getObject()); 
    int postagePerKg=10; 
    int postage=weight*postagePerKg; 
    if(discount!=null){ 
    postage=postage*discount.intValue()/100; 
    } 
    ShowPostage showPostage=new ShowPostage(postage); 
    setResponsePage(showPostage); 
    } 
    }; 
    TextField weight=new TextField("weight",weightModel); 
    form.add(weight); 
    TextField patronCode=new TextField("patronCode",patronCodeModel); 
    form.add(patronCode); 
    add(form); 
} 
} 

HTMLファイルGetRequest.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
    <html> 
     <form wicket:id="form"> 
    <table> 
     <tr> 
     <td>Weight</td> 
     <td><input type="text" wicket:id="weight"/></td> 
     </tr> 
     <tr> 
     <td>Patron code:</td> 
     <td><input type="text" wicket:id="patronCode"/></td> 
     </tr> 
     <tr> 
     <td></td> 
     <td><input type="submit"/></td> 
     </tr> 
    </table> 
     </form> 
    </html> 

例外メッセージ: WicketMessage:コンポーネントをターゲットorg.apache.wicket.markup.html.form.IFormSubmitListenerインタフェースのメソッドonFormSubmitted [MarkupContainer [部品ID =フォームは]例外

根本原因投げ:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 
    at myapp.postage.GetRequest$1.onSubmit(GetRequest.java:26) 
    at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1538) 
    at org.apache.wicket.markup.html.form.Form.process(Form.java:934) 
    at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:896) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182) 
    at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
    at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 
    at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:60) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:379) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:619) 

Complete stack: 
org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component [MarkupContainer [Component id = form]] threw an exception 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193) 
    at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
    at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182) 
    at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
    at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
    at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
    at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
    at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
    at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
    at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 
+2

あなたはどのバージョンのWicketを使用していますか? 1.4以降、ジェネリックを使用することができます。また、フォームフィールドを追加するコードを表示できますか? – bert

+0

ああ、コードを見る、申し訳ありません。私は自分の電話から投稿していて、スクロールできませんでした。 – bert

答えて

1

Wicket 1.4以上を使用している場合は、ジェネリックスを使用して、Wicketに期待するタイプを伝える必要があります。 Wicketはあなたのために変換を行います。

私は次の変更を示唆している(重量のために、他のフィールドは練習として残している;)):

private Integer weight; 

、ユーザの入力を保持するあなたのページにフィールドを追加します。

このフィールドのゲッターとセッターを追加します。

public Integer getWeight() {return weight;} 
public void SetWeight(Integer weight) {this.weight = weight;} 

を次に、と体重のためにテキストフィールドを追加するためのコードを置き換える:

form.add(new TextField<Integer>("weight" 
    , new PropertyModel<Integer>(this, "weight")); 

これで、Wicketはユーザー入力をIntegerに変換し、フィールドの重みに格納します。 PropertyModelは、ページ自体を使用してフィールドにアクセスします。

希望に役立ちます。

ヒント:ユーザーが変換できないものを入力した場合、Wicketはテキストフィールドにエラーを追加します。これを確認するには、あなたのページにフィードバックパネルを追加する必要があります。

お楽しみください

+0

セッター+ゲッターが必要でしょうか? – Karussell

+0

完全ではありません。私は例外なく例外を得ることを覚えています – bert

+0

ここにすべてのニュースはありますか?あなたは問題を解決しましたか? – bert

0

整数は機能する戻りますか? 例外はスローされますか?

ゼロの場合、多分getObject()は整数を返しません。

+0

の処理中: int weight =((Integer)weightModel.getObject())。intValue(); – yyy

+0

とgetObjectは必ず整数 – yyy

0

おそらく、weightModel.getObject()をStringに変換できませんでした。

なし。返されるオブジェクトはIntegerキャストで必要な整数ではありません。

返された文字列Integer.parseInt(str)を解析する方法があります(しかし、私はwicketがこれを行うことができると思います...)

+0

を返します。コードを書き直しても問題ありません。私は本当になぜそれが動作しなかったのか分からない – yyy

関連する問題