Thanks Richard, I wasn't aware of this. mc On 28 Oct 2005 at 6:48, Richard Yee wrote:
> You should be aware that when using a java.text.DateFormat class or its > subclass as a static variable in a bean that can be accessed via > multiple threads simultaneously, you need to synchronize access to it > because DateFormat is not thread-safe. So you should change the code > below to: > > public static synchronized String date2String(Date date) { > return sdf.format(date); > } > > or > > public static String date2String(Date date) { > synchronized (date) { > return sdf.format(date); > } > } > > > > This is from the DateFormat Javadoc:Synchronization > > Date formats are not synchronized. It is recommended to create separate > format instances for each thread. If multiple threads access a format > concurrently, it must be synchronized externally. > > Regards, > > Richard > > Murray Collingwood wrote: > > Hi > > > > I add additional getters and setters for handling dates and prices (and > > other special > > numeric formats). For example, in addition to the normal getter I code an > > additional > > one to retrieve the date as a string. > > > > public Date getDateStart() { > > return dateStart; > > } > > public String getDateStartAsString() { > > if (dateStart == null) return ""; > > return Focus.date2String(dateStart); > > } > > > > > > I then code up some static methods to format dates to strings and similar > > methods to > > make the opposite translation (string back to date). For example, a method > > from my > > Focus class related to the above code: > > > > public static String date2String(Date date) { > > return sdf.format(date); > > } > > > > And if you're desparate, here is the sdf definition: > > > > private static SimpleDateFormat sdf = new > > SimpleDateFormat("dd/MM/yyyy"); > > > > You can do the same thing with a Timestamp, depends how many fields you > > want to > > declare on your form and how much data entry you want your user to do. I > > used a > > similar method in my Focus class to get/set the date portion of the > > timestamp value: > > > > public static String timestamp2String(Timestamp ts) { > > if (ts == null) return ""; > > return date2String(new Date(ts.getTime())); > > } > > > > HTH > > mc > > > > > > On 28 Oct 2005 at 14:31, Yujun Liang wrote: > > > > > >> Hello, > >> > >> I am working on a project using Struts. Struts uses BeanUtil to populate > >> Action Form > >> > > Bean. This is such a nice framework to work with, except, > > > >> BeanUtil doesn't support java.util.Date conversion. But when I use > >> > > java.sql.Timestamp, it asks for the format of > > > >> yyyy-mm-dd hh:mm:ss.fffffffff > >> > >> Here is the exception when I enter other format, > >> > >> Caused by: java.lang.IllegalArgumentException: Timestamp format must > >> be yyyy- > >> > > mm-dd hh:mm:ss.fffffffff > > > >> In a web application, it is not reasonable to ask user to input yyyy-mm-dd > >> > > hh:mm:ss.fffffffff. > > > >> Also, it doesn't support Locale. > >> > >> Do you have experience getting java.util.Date populated in a Java Bean > >> inside a > >> > > FormBean? > > > >> Thanks in advance. > >> > >> Regards > >> Yujun Liang > >> [EMAIL PROTECTED] > >> (0408) 467 448 > >> > >> 1. Form Bean Definition, > >> <form-bean name="myForm" type="org.apache.struts.validator.DynaValidatorForm"> > >> > >> <form-property name="mybean" type="com.mycompany.myproject.bean.MyBean"/> > >> > >> </form-bean> > >> > >> 2. Java Bean, > >> > >> package com.mycompany.myproject.bean; > >> > >> import java.io.Serializable; > >> > >> import java.sql.Timestamp; > >> > >> import org.apache.commons.lang.builder.EqualsBuilder; > >> > >> import org.apache.commons.lang.builder.HashCodeBuilder; > >> > >> import org.apache.commons.lang.builder.ToStringBuilder; > >> > >> public abstract class MyBean implements Serializable { > >> > >> private long interchangeId; > >> > >> private Timestamp creationTime; > >> > >> private String originatingChannel; > >> > >> public long getInterchangeId() { > >> > >> return this.interchangeId; > >> > >> } > >> > >> public void setInterchangeId(long interchangeId) { > >> > >> this.interchangeId = interchangeId; > >> > >> } > >> > >> public Timestamp getCreationTime() { > >> > >> return this.creationTime; > >> > >> } > >> > >> > >> > >> public void setCreationTime(Timestamp creationTime) { > >> > >> this.creationTime = creationTime; > >> > >> } > >> > >> > >> public String getOriginatingChannel() { > >> > >> return this.originatingChannel; > >> > >> } > >> > >> public void setOriginatingChannel(String originatingChannel) { > >> > >> this.originatingChannel = originatingChannel; > >> > >> } > >> > >> } > >> > >> 3. HTML Form > >> > >> <input name="mybean.creationTime" type="text" size="30" maxlength="30" > >> > > value="25/10/2005"> > > > >> <input name="mybean.originatingChannel" type="text" size="40" > >> maxlength="40" > >> > > value="originating channel1"> > > > >> <input name="mybean.originatingChannelUserId" type="text" size="60" > >> > > maxlength="60" value="originating_channel_userid1"> > > > >> 4. Exception. > >> > >> [28/10/05 14:05:42:623 EST] 3f64a3f WebGroup E SRVE0026E: [Servlet Error]- > >> > > [BeanUtils.populate]: org.apache.commons.beanutils.ConversionException: Timestamp > > format must be yyyy-mm-dd hh:mm:ss.fffffffff > > > >> at > >> > > org.apache.commons.beanutils.converters.SqlTimestampConverter.convert(SqlTimesta > > mpConverter.java:117) > > > >> at > >> > > org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:428) > > > >> at > >> > > org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1004) > > > >> at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811) > >> > >> at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298) > >> > >> at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493) > >> > >> at > >> > > org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:80 > > 5) > > > >> at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203) > >> > >> at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194) > >> > >> at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) > >> > >> at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) > >> > >> at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) > >> > >> at > >> > > com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance. > > java:110) > > > >> at > >> > > com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.j > > ava:174) > > > >> at > >> > > com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java:3 > > 13) > > > >> at > >> > > com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.ja > > va:116) > > > >> at > >> > > com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java:283) > > > >> at > >> > > com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletRef > > erenceState.java:42) > > > >> at > >> > > com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceR > > eference.java:40) > > > > > > > > > > FOCUS Computing > > Mob: 0415 24 26 24 > > [EMAIL PROTECTED] > > http://www.focus-computing.com.au > > > > > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > > -- > No virus found in this incoming message. > Checked by AVG Free Edition. > Version: 7.1.362 / Virus Database: 267.12.5/150 - Release Date: 27/10/2005 > FOCUS Computing - web design Mob: 0415 24 26 24 [EMAIL PROTECTED] http://www.focus-computing.com.au -- No virus found in this outgoing message. Checked by AVG Free Edition. Version: 7.1.362 / Virus Database: 267.12.5/150 - Release Date: 27/10/2005 --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]