Создайте пользовательский конвертер, который принимает несколько компонентов на <f:attribute>
на компоненте.
Вот как бы вы хотели, чтобы вид был похож на:
<h:inputText id="input" value="#{bean.date}">
<f:converter converterId="multiDateConverter" />
<f:attribute name="pattern1" value="MM/dd/yyyy" />
<f:attribute name="pattern2" value="MM-dd-yyyy" />
</h:inputText>
И воткак может выглядеть конвертер (для JSF 1.x зарегистрируйте его как
<converter-id>multiDateConverter</converter-id>
вместо faces-config.xml
)
@FacesConverter(value="multiDateConverter")
public class MultiDateConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
List<String> patterns = getPatterns(component);
Date date = null;
for (String pattern : patterns) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setLenient(false); // Don't parse dates like 33-33-3333.
try {
date = sdf.parse(value);
break;
} catch (ParseException ignore) {
//
}
}
if (date == null) {
throw new ConverterException(new FacesMessage("Invalid date format, must match either of " + patterns));
}
return date;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException {
return new SimpleDateFormat(getPatterns(component).get(0)).format((Date) value);
}
private static List<String> getPatterns(UIComponent component) {
List<String> patterns = new ArrayList<String>();
for (int i = 1; i < Integer.MAX_VALUE; i++) {
String pattern = (String) component.getAttributes().get("pattern" + i);
if (pattern != null) {
patterns.add(pattern);
} else {
break;
}
}
if (patterns.isEmpty()) {
throw new IllegalArgumentException("Please provide <f:attribute name=\"patternX\"> where X is the order number");
}
return patterns;
}
}
Обратите внимание, что он выбирает только первое (по умолчанию)шаблон для повторного отображения значения.Таким образом, в приведенном выше примере, если вы введете 05-10-2011
, он будет отображаться как 05/10/2011
.
Не связанный с конкретной проблемой, шаблон MM-dd-yyyy
isn 'Т очень часто.Разве вы не хотели использовать dd-MM-yyyy
?