Date
のオブジェクトを変換するために、JSF 1.2でカスタムConverter
を作成しました。日付は非常に特殊な形式です。私は変換を行うためにコアJavaのSimpleDateFormat
クラスを使用して私のコンバータを実装しました。私のコードコメントに示されているフォーマッタ文字列を使っています。これはすべて正常に動作します。JSFカスタムコンバータfor日付 - スレッドセーフですか?
私の質問は、スレッドの安全性です。 SimpleDateFormat
APIドキュメントでは、スレッドセーフではないことを示しています。そのため、私は、コンバータオブジェクトのインスタンスごとに日付書式オブジェクトの別のインスタンスを作成しました。しかし、これで十分か分かりません。私のDateFormat
オブジェクトは、DTGDateConverter
のメンバーとして格納されています。
質問:2つのスレッドが同時にJSF内のConverterオブジェクトの同じインスタンスにアクセスしますか?
答えが「はい」の場合、私のコンバータはおそらく危険にさらされています。
/**
* <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?!あなたはどこですか? – mkoryak
@mkoryak:私も仕事と人生を共にしています:) – BalusC
111K rep、thatsすべて私は言っています:) – mkoryak