2012-04-23 95 views
3

我正在將項目從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 

回答

6

重新聲明背後#{pc_NewContract.overrideAsOfDtSQL}財產java.util.Date而不是java.sql.Date。根本不應該在模型中使用JDBC特定的數據類型。請注意,java.sql.Datejava.util.Date的子類,因此在DAO中從數據庫映射到模型時根本不需要轉換它。

+0

我用了'java.lang.Calendar'的時間戳,我有那麼用@Temporal(TemporalType.TIMESTAMP)'註解。在這裏需要更改爲'java.util.Date'來使'p:calendar'再次快樂(否則會出現類似的異常) – Roland 2017-09-22 22:28:22

0

有沒有改變休眠模型的解決方法。我更喜歡這種方式,因爲所有更改都在jsf圖層中。

您可以在複合組件中使用綁定。下一個代碼是例如具有豐富:日曆(使用java.util.Date)

... < CC:接口組件類型= 「CalendarComponent」 >

... < /立方厘米:接口>

&lt;cc:implementation&gt; 

... <富:歷值= 「#{} 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; 
} 

} 
+1

這隻能從日期中刪除時間部分,我沒有看到這是多麼有用如果你可以使用''。 – BalusC 2013-11-01 19:19:20

相關問題