Domanda

sto imparando Wicket da "Godendo di sviluppo Web con Wicket" book.It è scritto per Wicket 1.4.7 Comprare e in un esempio:

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

viene utilizzato. Quando scatto pulsante di invio si getta imprevisto RuntimeException prime righe:

WicketMessage: Metodo onFormSubmitted dell'interfaccia org.apache.wicket.markup.html.form.IFormSubmitListener rivolge a componente [MarkupContainer [Component id = Forma]] ha generato un'eccezione

La causa all'origine:

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

Probabilmente weightModel.getObject () non potrebbe essere convertito per Stringa .

Il messaggio completo eccezione è in basso.

Ma dopo ha cambiato il codice per:

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

Funziona bene. Si suppone di funzionare bene. Qual è il motivo per lanciare l'eccezione?


Il codice completo:

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

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

Messaggio di eccezione: WicketMessage: Metodo onFormSubmitted dell'interfaccia org.apache.wicket.markup.html.form.IFormSubmitListener rivolge a componente [MarkupContainer [Component id = Forma]] ha generato un'eccezione

La causa all'origine:

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)
È stato utile?

Soluzione

Se si utilizza Wicket 1.4 e, soprattutto, è necessario utilizzare farmaci generici e li usa per dire che tipo wicket che ci si aspetta. Wicket farà la conversione per voi allora.

Vorrei suggerire le seguenti modifiche (per il peso, l'altro campo viene lasciato come esercizio;)):

Aggiungere un campo alla pagina di che conterrà l'input dell'utente:

private Integer weight;

Aggiungi getter e setter per questo campo:

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

Quindi, sostituire il codice per aggiungere il Textfield per il peso con:

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

Con questo, Wicket convertirà l'userinput in un intero e memorizzarlo nel peso campo. Il PropertyModel utilizza la pagina stessa per accedere al campo.

La speranza che aiuta.

Suggerimento: nel caso in cui l'utente inserisce qualcosa che non può essere convertito, Wicket aggiungerà un errore al Textfield. Si dovrebbe aggiungere un Feedbackpanel alla tua pagina per vedere questo.

Godetevi

Altri suggerimenti

Quali intero fa la funzione che funziona rendimenti? E quale eccezione getta?

Se il suo pari a zero, forse getObject () non restituisce un numero intero a tutti.

Probabilmente weightModel.getObject () potrebbe non essere convertito in stringa.

n. l'oggetto restituito è una stringa non un intero come si desidera con il cast Integer.

una soluzione sarebbe quella di analizzare la stringa restituita Integer.parseInt (str) (ma penso che wicket può fare questo per voi ...)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top