我想使用泛型類作爲Spring表單輔助bean,但最終SpringClassException嘗試將對象轉換爲實際類型時出現ClassCastException。Spring ClassCastException與泛型表單Bean類
java.lang.ClassCastException: java.lang.Object cannot be cast to com.[...].portal.entity.SrvRecord
at com.[...].portal.controller.SrvController.add(SrvController.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Form Bean的:
public class RecordBean<T>
{
private T original;
private T modified;
public RecordBean()
{
super();
}
public RecordBean(T original)
{
this.original = original;
this.modified = original;
}
public T getOriginal()
{
return original;
}
public void setOriginal(T original)
{
this.original = original;
}
public T getModified()
{
return modified;
}
public void setModified(T modified)
{
this.modified = modified;
}
}
在提交表單,嘗試呼叫的方法的SrvRecord對象(線105,標有評論)上時,會發生下面的錯誤控制方法:
@RequestMapping(value = "new", method = RequestMethod.GET)
public String add(Model model)
{
SrvRecord srvRecord = getSrvRecord();
RecordBean<SrvRecord> record = new RecordBean<SrvRecord>(srvRecord);
model.addAttribute("record", record);
return "generic/new";
}
@RequestMapping(value = "new", method = RequestMethod.POST)
public String add(Model model, @ModelAttribute("record") RecordBean<SrvRecord> record)
{
// Call a method on the SrvRecord object
doSomething(record.getModified().getZone().getName()); // line 105
doSomething(record.getOriginal().getZone().getName());
// ...
}
查看:
<c:url value="/edit" var="formUrl" />
<form:form commandName="record" action="${formUrl}">
<form:input type="hidden" path="original.zone" />
<form:input type="hidden" path="original.name" />
<!-- ... -->
<form:input path="modified.zone" /><br />
<form:input path="modified.name" /><br />
<!-- ... -->
</form:form>
任何想法或建議都會很棒。能夠使用通用表單bean將消除來自基線的大量不必要的代碼。
僅供參考,所使用的Spring版本是3.0.6.RELEASE。
感謝, 博
顯然'getSrvRecord()'也是通用的,它返回錯誤的類型......右?哪一行是'SrvController.java:105'? – Saintali
'getSrvRecord )'不是泛型的,並且返回一個SrvRecord對象,第105行在'modify'方法中標註了一條註釋 –
但是棧跟蹤表明第105行位於'SrvController.add'中,也許編譯問題I感覺它很好嘗試重新編譯和再次運行 – Saintali