无法将类java.util.Date的4/23/12 12:00 AM转换为类java.sql.Date
我正在将项目从WebSphere 7迁移到WebSphere 8,并且正在使用JSF 1.2。无法将类java.util.Date的4/23/12 12:00 AM转换为类java.sql.Date
我正面临着IBM JSF/html_extended标记以及标准转换器(主要是JSF 1.2核心组件)的问题。我也将我的Java EE版本从5更新到6(这可能不是原因)。最后,还给出了一个组件树。
下面是我的堆栈跟踪:
javax.faces.component.UpdateModelException: org.apache.jasper.el.JspELException: /sc40/NewContract.jsp(130,5) '#{pc_NewContract.overrideAsOfDtSQL}' Cannot convert 4/23/12 12:00 AM of type class java.util.Date to class java.sql.Date at javax.faces.component.UIInput.updateModel(UIInput.java:398) at javax.faces.component.UIInput.processUpdates(UIInput.java:299) at javax.faces.component.UIForm.processUpdates(UIForm.java:187) at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1258) at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1258) at javax.faces.component.UIViewRoot._processUpdatesDefault(UIViewRoot.java:1321) at javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:75) at javax.faces.component.UIViewRoot$UpdateModelPhaseProcessor.process(UIViewRoot.java:1423) at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1282) at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:765) at org.apache.myfaces.lifecycle.UpdateModelValuesExecutor.execute(UpdateModelValuesExecutor.java:34) at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1147) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:722) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:449) at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178) at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1020) at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3639) at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304) at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:950) at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1659) at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305) at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83) at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:816) at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1648) Caused by: org.apache.jasper.el.JspELException: /sc40/NewContract.jsp(130,5) '#{pc_NewContract.overrideAsOfDtSQL}' Cannot convert 4/23/12 12:00 AM of type class java.util.Date to class java.sql.Date at org.apache.jasper.el.JspValueExpression.setValue(JspValueExpression.java:98) at javax.faces.component.UIInput.updateModel(UIInput.java:380) ... 35 more
重新声明背后#{pc_NewContract.overrideAsOfDtSQL}
财产java.util.Date
而不是java.sql.Date
。根本不应该在模型中使用JDBC特定的数据类型。请注意,java.sql.Date
是java.util.Date
的子类,因此在DAO中从数据库映射到模型时根本不需要转换它。
有没有改变休眠模型的解决方法。我更喜欢这种方式,因为所有更改都在jsf图层中。
您可以在复合组件中使用绑定。下一个代码是例如具有丰富:日历(使用java.util.Date)
... < CC:接口组件类型= “CalendarComponent” >
... < /立方厘米:接口>
<cc:implementation>
... <富:历值= “#{} cc.attrs.value” 绑定= “#{} cc.attrs.calendar”/ >
...
</CC:实施>
...
和CalendarComponent:
import java.util.Date;
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;
import javax.faces.context.FacesContext;
import org.richfaces.component.UICalendar;
@FacesComponent(value = "CalendarComponent")
public class CalendarComponent extends UINamingContainer {
@Override
public void processUpdates(FacesContext context) {
Object o = calendar.getValue();
if (o instanceof Date) {
Date d = (Date) o;
//this ensures type changing
calendar.setValue(new java.sql.Date(d.getTime()));
}
super.processUpdates(context);
}
private UICalendar calendar;
public UICalendar getCalendar() {
return calendar;
}
public void setCalendar(UICalendar calendar) {
this.calendar = calendar;
}
}
这只能从日期中删除时间部分,我没有看到这是多么有用如果你可以使用'
我用了'java.lang.Calendar'的时间戳,我有那么用@Temporal(TemporalType.TIMESTAMP)'注解。在这里需要更改为'java.util.Date'来使'p:calendar'再次快乐(否则会出现类似的异常) – Roland 2017-09-22 22:28:22