2010-12-28 2 views
0

ich Wicket lerne von "Web-Entwicklung Genießen mit Wicket" book.It für Wicket geschrieben 1.4.7
Und in einem Beispiel:Warum ((Integer) weightModel.getObject()). IntValue(); wirft Ausnahme

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

verwendet wird. Wenn ich Taste klicken Sie auf Absenden es Unexpected Runtime ersten Zeilen wirft:

WicketMessage: Methode onFormSubmitted der Schnittstelle org.apache.wicket.markup.html.form.IFormSubmitListener an Komponente gezielt [MarkupContainer [Komponente id = Form]] warf ein Ausnahme

Ursachen:

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

Wahrscheinlich weightModel.getObject() konnte nicht zu String umgewandelt werden.

Die vollständige Ausnahmebedingungsnachricht befindet sich am unteren Rand.

Aber nach verändert den Code:

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

Es funktioniert gut. Es soll gut funktionieren. Was ist der Grund für das Auslösen der Ausnahme?


Der vollständige Code:

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

Die HTML-Datei 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> 

Ausnahmemeldung: WicketMessage: Methode onFormSubmitted der Schnittstelle org.apache.wicket.markup.html.form.IFormSubmitListener an Komponente gezielt [MarkupContainer [Component ID = form]] hat eine Ausnahme

Ursachen:

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

Welche Version von Wicket verwenden Sie? Seit 1.4 können und sollten Sie Generika verwenden. Können Sie auch den Code anzeigen, den Sie zum Hinzufügen der Formularfelder verwenden? – bert

+0

Ahh, ich sehe den Code, sorry. Ich habe von meinem Handy aus gepostet und konnte nicht scrollen. – bert

Antwort

1

Wenn Sie Wicket 1.4 und höher verwenden, sollten Sie Generika verwenden und sie verwenden, um Wicket mitzuteilen, welchen Typ Sie erwarten. Wicket übernimmt dann die Umstellung für Sie.

Ich würde folgende Änderungen vorschlagen (für das Gewicht, das andere Feld als Übung;)):

ein Feld Sie Seite hinzufügen, die die Eingabe des Benutzers halten:

private Integer weight; 

Getter und Setter für dieses Feld hinzufügen:

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

Dann ersetzen Sie den Code, um das Textfeld für das Gewicht mit hinzuzufügen:

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

Wicket konvertiert die Benutzereingabe in eine Ganzzahl und speichert sie in das Feldgewicht. Das PropertyModel verwendet die Seite selbst, um auf das Feld zuzugreifen.

Hoffe, dass hilft.

Hinweis: Falls der Benutzer etwas eingibt, das nicht konvertiert werden kann, fügt Wicket dem Textfeld einen Fehler hinzu. Sie sollten ein Feedbackpanel zu Ihrer Seite hinzufügen, um dies zu sehen.

Genießen Sie

+0

Sind Sie sicher, dass Sie Setter + Getter brauchen? – Karussell

+0

Nicht ganz. aber ich erinnere mich daran, Ausnahmen ohne – bert

+0

zu bekommen. Irgendwelche Neuigkeiten hier? Hast du das Problem gelöst? – bert

0

Welches Integer funktioniert die funktion, die funktioniert? Und welche Ausnahme wirft?

Wenn es 0 ist, gibt getObject() möglicherweise gar keine Ganzzahl zurück.

+0

im Prozess von: int Gewicht = ((Integer) WeightModel.getObject()). IntValue(); – yyy

+0

und getObject gibt sicher eine Ganzzahl – yyy

0

Wahrscheinlich konnte wightModel.getObject() nicht in String konvertiert werden.

Nr. Das zurückgegebene Objekt ist eine Zeichenfolge, die keine Ganzzahl ist, wie Sie es bei der Integer-Umwandlung haben möchten.

eine Lösung wäre, die zurückgegebene Zeichenfolge Integer.parseInt (str) zu parsen (aber ich denke, Wicket kann das für Sie tun ...))

+0

Ich habe den Code neu geschrieben und es hat gut funktioniert. Ich weiß wirklich nicht, warum es nicht funktioniert – yyy