J'ai créé un Converter
personnalisé en JSF 1.2 pour convertir Date
objets. Les dates ont un format très particulier. J'ai implémenté mon convertisseur en utilisant la classe principale Java SimpleDateFormat
pour faire la conversion, en utilisant la chaîne de formatage montrée dans mes commentaires de code ci-dessous. Tout cela fonctionne très bien.Convertisseur JSF personnalisé pour Date - Est-ce que le thread est sûr?
Ma question concerne la sécurité des threads. Les documents API SimpleDateFormat
indiquent qu'il n'est pas thread-safe. Pour cette raison, j'ai créé une instance séparée de l'objet format de date pour chaque instance de mon objet convertisseur. Cependant, je ne suis pas sûr que cela suffise. Mon objet DateFormat
est stocké en tant que membre du DTGDateConverter
.
QUESTION: Deux threads accéderont-ils simultanément à la même instance d'un objet Converter dans JSF?
Si la réponse est oui, alors mon convertisseur est probablement à risque.
/**
* <p>JSF Converter used to convert from java.util.Date to a string.
* The SimpleDateFormat format used is: ddHHmm'Z'MMMyy.</p>
*
* <p>Example: October 31st 2010 at 23:59 formats to 312359ZOCT10</p>
*
* @author JTOUGH
*/
public class DTGDateConverter implements Converter {
private static final Logger logger =
LoggerFactory.getLogger(DTGDateConverter.class);
private static final String EMPTY_STRING = "";
private static final DateFormat DTG_DATE_FORMAT =
MyFormatterUtilities.createDTGInstance();
// The 'format' family of core Java classes are NOT thread-safe.
// Each instance of this class needs its own DateFormat object or
// runs the risk of two request threads accessing it at the same time.
private final DateFormat df = (DateFormat)DTG_DATE_FORMAT.clone();
@Override
public Object getAsObject(
FacesContext context,
UIComponent component,
String stringValue)
throws ConverterException {
Date date = null;
// Prevent ParseException when an empty form field is submitted
// for conversion
if (stringValue == null || stringValue.equals(EMPTY_STRING)) {
date = null;
} else {
try {
date = df.parse(stringValue);
} catch (ParseException e) {
if (logger.isDebugEnabled()) {
logger.debug("Unable to convert string to Date object", e);
}
date = null;
}
}
return date;
}
@Override
public String getAsString(
FacesContext context,
UIComponent component,
Object objectValue)
throws ConverterException {
if (objectValue == null) {
return null;
} else if (!(objectValue instanceof Date)) {
throw new IllegalArgumentException(
"objectValue is not a Date object");
} else {
// Use 'toUpperCase()' to fix mixed case string returned
// from 'MMM' portion of date format
return df.format(objectValue).toUpperCase();
}
}
}
balusC?!où êtes-vous – mkoryak
@mkoryak: J'ai un travail et une vie aussi :) – BalusC
111K rep, c'est tout ce que je vais dire :) – mkoryak