为什么((整数)weightModel.getObject()).intValue();抛出异常
我正在通过“使用Wicket享受Web开发”这本书学习Wicket。它是为Wicket 1.4.7编写的为什么((整数)weightModel.getObject()).intValue();抛出异常,model,wicket,string-conversion,Model,Wicket,String Conversion,我正在通过“使用Wicket享受Web开发”这本书学习Wicket。它是为Wicket 1.4.7编写的 在一个示例中: int-weight=((整数)weightModel.getObject()).intValue(); 使用了。 当我单击Submit按钮时,它会在第一行抛出意外的RuntimeException: WicketMessage:org.apache.wicket.markup.html.form.IFormSubmitListener接口的方法onFormSubmitt
在一个示例中:
int-weight=((整数)weightModel.getObject()).intValue();
使用了
。 当我单击Submit按钮时,它会在第一行抛出意外的RuntimeException: WicketMessage:org.apache.wicket.markup.html.form.IFormSubmitListener接口的方法onFormSubmitted针对组件[MarkupContainer[component id=form]]引发了异常 根本原因:
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer*
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)
可能weightModel.getObject()无法转换为字符串
完整的异常消息位于底部
但将代码更改为:
int-weight=Integer.parseInt((字符串)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:工作的函数返回哪个整数? 哪个异常抛出 如果为零,则getObject()可能根本不返回整数 可能无法将weightModel.getObject()转换为字符串 否。返回的对象是一个字符串,而不是整数,因为您希望它与整数强制转换一起使用
一种解决方案是解析返回的字符串Integer.parseInt(str)(但我认为wicket可以为您做到这一点…如果您使用的是wicket 1.4及更高版本,您应该使用泛型并使用它们告诉wicket您期望的类型。维克特会帮你做转换的 我建议进行以下更改(对于重量,另一个字段留作练习;): 在页面中添加一个字段,该字段将保存用户的输入:
private Integer weight;
为此字段添加getter和setter:
public Integer getWeight() {return weight;}
public void SetWeight(Integer weight) {this.weight = weight;}
然后,将添加权重文本字段的代码替换为:
form.add(new TextField<Integer>("weight"
, new PropertyModel<Integer>(this, "weight"));
form.add(新文本字段(“权重”)
,新PropertyModel(此“重量”);
Wicket将用户输入转换成整数,并将其存储到字段权重中。PropertyModel使用页面本身访问字段
希望有帮助
提示:如果用户输入了无法转换的内容,Wicket将在文本字段中添加一个错误。您应该在页面中添加一个反馈面板来查看此信息
在以下过程中享受:int-weight=((整数)weightModel.getObject()).intValue();并且getObject肯定会返回一个整数您使用的Wicket版本是什么?因为1.4您可以也应该使用泛型。另外,您可以显示用于添加表单字段的代码吗?啊,我看到了代码,抱歉。我是从手机上发布的,无法滚动。您确定需要setter+getter吗?不完全是。但我记得遇到了异常我重新编写了代码,它工作得很好。我真的不知道为什么它不工作。Wicket不会只使用尖括号进行转换,因为它不能。Java的泛型使用擦除,并且这种泛型类型信息在运行时保留。您必须提供一个正确类型的模型“后端”(例如,一个属性,如您的示例中所示)要使转换正常工作,请显式地向组件提供一个转换器,或者,如果特定组件支持转换,请告诉组件要转换的类型(TextField支持在构造函数中传递它)。我重新编写了代码,它工作得很好。我真的不知道为什么它不工作
form.add(new TextField<Integer>("weight"
, new PropertyModel<Integer>(this, "weight"));