Jsf 无法将java.util.Date类的4/23/12:00 AM转换为java.sql.Date类

Jsf 无法将java.util.Date类的4/23/12:00 AM转换为java.sql.Date类,jsf,migration,jsf-1.2,websphere-7,websphere-8,Jsf,Migration,Jsf 1.2,Websphere 7,Websphere 8,我正在将我的项目从WebSphere7迁移到WebSphere8,并使用JSF1.2 我在使用IBM JSF/html_扩展标记和标准转换器时遇到了一个问题,它们主要是JSF 1.2核心组件。我还将JavaEE版本从5升级到6(这可能不是原因)。最后,给出了一个组件树 下面是我的堆栈跟踪: javax.faces.component.UpdateModelException: org.apache.jasper.el.JspELException: /sc40/NewContract.jsp(1

我正在将我的项目从WebSphere7迁移到WebSphere8,并使用JSF1.2

我在使用IBM JSF/html_扩展标记和标准转换器时遇到了一个问题,它们主要是JSF 1.2核心组件。我还将JavaEE版本从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 javax.faces.component.UpdateModelException:org.apache.jasper.el.jspeleException:/sc40/NewContract.jsp(130,5)“#{pc_NewContract.overrideAsOfDtSQL}”无法将java.util.Date类的4/23/12:00 AM类型转换为java.sql.Date类 位于javax.faces.component.UIInput.updateModel(UIInput.java:398) 在javax.faces.component.UIInput.processUpdates(UIInput.java:299) 位于javax.faces.component.UIForm.processUpdates(UIForm.java:187) 位于javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1258) 位于javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1258) 位于javax.faces.component.UIViewRoot.\u processUpdatesDefault(UIViewRoot.java:1321) 位于javax.faces.component.UIViewRoot.access$600(UIViewRoot.java:75) 位于javax.faces.component.UIViewRoot$UpdateModelPhaseProcessor.process(UIViewRoot.java:1423) 位于javax.faces.component.UIViewRoot.\u进程(UIViewRoot.java:1282) 位于javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:765) 位于org.apache.myfaces.lifecycle.UpdateModelValuesExecutor.execute(UpdateModelValuesExecutor.java:34) 位于org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171) 位于org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 位于javax.faces.webapp.FacesServlet.service(FacesServlet.java:189) 位于com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1147) 位于com.ibm.ws.webcontainer.servlet.ServletWrapper.HandlerRequest(ServletWrapper.java:722) 位于com.ibm.ws.webcontainer.servlet.ServletWrapper.HandlerRequest(ServletWrapper.java:449) 位于com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.HandlerRequest(ServletWrapperImpl.java:178) 在com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters上(WebAppFilterManager.java:1020) 位于com.ibm.ws.webcontainer.webapp.webapp.handleRequest(webapp.java:3639) 位于com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304) 位于com.ibm.ws.webcontainer.webcontainer.handleRequest(webcontainer.java:950) 位于com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1659) 位于com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195) 位于com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452) 位于com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511) 在com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)上 位于com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83) 在com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted上(AioReadCompletionListener.java:165) 位于com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 位于com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) 位于com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) 位于com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) 位于com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:816) 位于com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) 位于com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1648) 原因:org.apache.jasper.el.jspeleexception:/sc40/NewContract.jsp(130,5)#{pc_NewContract.overrideAsOfDtSQL}无法将java.util.Date类的4/23/12 12:00 AM转换为java.sql.Date类 位于org.apache.jasper.el.JspValueExpression.setValue(JspValueExpression.java:98) 位于javax.faces.component.UIInput.updateModel(UIInput.java:380) ... 35多 “#{pc_NewContract.overrideAsOfDtSQL}”无法将java.util.Date类的4/23/12:00 AM类型转换为java.sql.Date类

你显然有一个

private java.sql.Date overrideAsOfDtSQL;
这是不对的。
java.sql.*
类型不属于该模型。将其替换为
java.util.Date

private java.util.Date overrideAsOfDtSQL;
当您使用
java.sql.Time
时,同样的答案也适用


请注意,
java.sql.Date
java.sql.Time
java.util.Date
的子类,这就是为什么它在使用
从对象转换为字符串时起作用。仅从字符串转换为对象将不起作用,因为
总是转换为
java.util.Date

有一种不改变hibernate模型的解决方法。我更喜欢这种方式,因为所有的更改都在jsf层中

private java.util.Date overrideAsOfDtSQL;
您可以在复合组件中使用绑定。下一个代码是rich:calendar(使用java.util.Date)的示例

。。。

。。。

。。。


在日历组件中:

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
再次快乐(否则会出现类似的异常情况)。