【问题标题】:Cannot convert 4/23/12 12:00 AM of type class java.util.Date to class java.sql.Date无法将类 java.util.Date 类型的 4/23/12 上午 12:00 转换为类 java.sql.Date
【发布时间】:2012-05-04 10:18:20
【问题描述】:

我正在将我的项目从 WebSphere 7 迁移到 WebSphere 8,并且我正在使用 JSF 1.2。

我遇到了 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}' 无法转换 4/23/12 12:00 AM 类型类 java.util.Date 到类 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._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._process(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.handleRequest(ServletWrapper.java:722) 在 com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:449) 在 com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(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.JspELException:/sc40/NewContract.jsp(130,5) '#{pc_NewContract.overrideAsOfDtSQL}' 无法转换 2012 年 4 月 23 日凌晨 12:00 类 java.util。类 java.sql.Date 的日期 在 org.apache.jasper.el.JspValueExpression.setValue(JspValueExpression.java:98) 在 javax.faces.component.UIInput.updateModel(UIInput.java:380) ... 35 更多

【问题讨论】:

    标签: jsf migration jsf-1.2 websphere-7 websphere-8


    【解决方案1】:

    '#{pc_NewContract.overrideAsOfDtSQL}' 无法将类 java.util.Date 类型的 4/23/12 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.Datejava.sql.Timejava.util.Date 的子类,这就是使用<f:convertDateTime> 从对象转换为字符串的原因。仅从字符串转换为对象是行不通的,因为<f:convertDateTime> 总是转换为java.util.Date

    【讨论】:

    • 我曾使用java.lang.Calendar 作为时间戳,然后用@Temporal (TemporalType.TIMESTAMP) 进行注释。更改为java.util.Date 是为了让p:calendar 再次开心(否则会出现类似的例外情况。
    【解决方案2】:

    有一种解决方法,无需更改休眠模式。我更喜欢这种方式,因为所有的变化都在 jsf 层中。

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

    ...

    ... 接口>

    <cc:implementation>
    

    ...

    ...
    实现>

    ...

    在日历组件中:

    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;
    }
    
    }
    

    【讨论】:

    • 这实际上只是从日期中去除了时间部分。如果您可以使用<f:convertDateTime>,我看不出它有什么用处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2020-11-19
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多