Why ((Integer) weightModel.getObject ()). IntValue (); выдает исключение - PullRequest
0 голосов
/ 29 декабря 2010

Я изучаю Wicket по книге "Наслаждаюсь веб-разработкой с Wicket". Она написана для Wicket 1.4.7И в примере:

int weight = ((Integer) weightModel.getObject()).intValue(); используется.Когда я нажимаю кнопку «Отправить», он выдает неожиданные первые строки RuntimeException:

WicketMessage: метод onFormSubmitted интерфейса org.apache.wicket.markup.html.form.IFormSubmitListener, предназначенного для компонента [MarkupContainer [Component id = form]]исключение

Основная причина:

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

Возможно weightModel.getObject () не удалось преобразовать в строку .

Полное сообщение об исключении находится внизу.

Но после того, как изменили код на:

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: Метод onFormSubmitted в интерфейсе org.apache.wicket.markup.html.form.IFormSubmitListener, предназначенный для компонента [MarkupContainer [Component id = form]] выдал исключение

Основная причина:

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)

Ответы [ 3 ]

1 голос
/ 29 декабря 2010

Если вы используете Wicket 1.4 и выше, вы должны использовать дженерики и использовать их, чтобы сообщить калитке, какой тип вы ожидаете.Тогда 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 преобразует пользовательский ввод в целое число и сохраняет его в весе поля.PropertyModel использует саму страницу для доступа к полю.

Надеюсь, это поможет.

Подсказка: если пользователь вводит что-то, что не может быть преобразовано, Wicket добавит ошибку в текстовое поле.Вы должны добавить панель обратной связи на свою страницу, чтобы увидеть это.

Наслаждайтесь

0 голосов
/ 29 декабря 2010

Возможно, weightModel.getObject () не удалось преобразовать в строку.

нет.возвращаемый объект является строкой, а не целым числом, как вы хотите с помощью приведения типа Integer.

Одним из решений было бы проанализировать возвращенную строку Integer.parseInt (str) (но я думаю, что wicket может сделать это за вас...)

0 голосов
/ 29 декабря 2010

Какое целое число возвращает функция, которая работает?И какое исключение выдает?

Если его ноль, возможно, getObject () вообще не возвращает целое число.

...