Frage

Ich lerne Wicket, indem ich das Buch "Web Development With Wicket" genieße. Es ist für Wicket 1.4.7 geschrieben
Und in einem Beispiel:

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

wird genutzt. Wenn ich auf die Schaltfläche klicke, wirft es unerwartete RunTimeException erste Zeilen aus:

WicketMessage: Methode, die von Schnittstellen org.apache.wicket.markup.html.form.formSubmitListener gezielt auf Komponente [MarkupContainer [Komponenten -ID = Form]] ausgezeichnet wurde, warf eine Ausnahme

Tiefere Ursache:

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

Wahrscheinlich WeightModel.getObject () konnte nicht konvertiert werden zu String.

Die vollständige Ausnahmebotschaft ist unten.

Aber nachdem der Code geändert wurde in:

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

Es funktioniert gut. Es soll gut funktionieren. Was ist der Grund für die 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>

Ausnahmenachricht:WicketMessage: Methode, die von Schnittstellen org.apache.wicket.markup.html.form.formSubmitListener gezielt auf Komponente [MarkupContainer [Komponenten -ID = Form]] ausgezeichnet wurde, warf eine Ausnahme

Tiefere Ursache:

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)
War es hilfreich?

Lösung

Wenn Sie Wicket 1.4 und höher verwenden, sollten Sie Generika verwenden und sie verwenden, um Wicket zu sagen, welchen Typ Sie erwarten. Wicket wird dann die Konvertierung für Sie durchführen.

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

Fügen Sie Ihrer Seite ein Feld hinzu, auf dem die Eingabe des Benutzers gehalten wird:

private Integer weight;

Fügen Sie Getter und Setter für dieses Feld hinzu:

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

Ersetzen Sie dann den Code, um das Textfeld für Gewicht hinzuzufügen mit:

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

Damit wandelt Wicket den UserInput in eine Ganzzahl um und speichert ihn in das Feldgewicht. Das PropertyModel verwendet die Seite selbst, um auf das Feld zuzugreifen.

Ich hoffe, das hilft.

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

Genießen

Andere Tipps

Welche Ganzzahl kehrt die Funktion zurück, die funktioniert? Und welche Ausnahme wirft?

Wenn es Null ist, gibt GetObject () eine Ganzzahl überhaupt nicht zurück.

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

nein. Das zurückgegebene Objekt ist eine Zeichenfolge, die keine Ganzzahl, wie Sie es mit der Ganzzahlbesetzung haben möchten.

Eine Lösung wäre, die zurückgegebene String Integer.ParseInt (STR) zu analysieren (aber ich denke, Wicket kann dies für Sie tun ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top