De vez em quando será necessário usar vários conversores para o mesmo tipo.
Nota importante: Mas isso não deveria ser uma questão de localização que pode ser realizada com conversores baseados no locale. Esses conversores podem ler o locale do usuário para converter a data conforme a região.
Existem outras situações, quando você quiser converter a data, uma para a data e outra somente para as horas ... Como nos poderemos resolver isso?
O conversor para calendar é ativado por padrão e trata datas curtas (sem horas).
Por isso nos deveríamos ter um problema com o formato de datas somente para horas:
package org.vraptor.example.converter;
import java.util.Calendar;
/**
* Uma classe que contém informações sobre a data de inicio e a duração.
*
* @author Guilherme Silveira
*/
public class TimeInfo {
private Calendar startDate;
private Calendar duration;
public Calendar getDuration() {
return duration;
}
public void setDuration(Calendar duration) {
this.duration = duration;
}
public Calendar getStartDate() {
return startDate;
}
public void setStartDate(Calendar startDate) {
this.startDate = startDate;
}
}Vamos ver a nossa lógica de negócios ... uma lógica simples que não faz nada:
package org.vraptor.example.converter;
import org.vraptor.annotations.Component;
@Component("converter")
public class ConverterOverridingLogic {
private TimeInfo info;
public void overriding(TimeInfo info) {
//sua lógica de negócios
this.info = info;
}
public TimeInfo getInfo() {
return this.info;
}
}Então vamos sobrescrever e converter a variável duration ...
Use a anotação @Conversion, que recebe o converter como parâmetro:
@Conversion(LocaleCalendarTimeConverter.class)
public void setDuration(Calendar duration) {
this.duration = duration;
}Vamos criar o arquivo /converter/overriding.jsp:
<html>
Preencha o formulário abaixo e lembre-se de usar o locale inglês. (padrão web.xml)!<br/>
<form action="converter.overriding.logic">
Data de incio: <input name="info.startDate"/> (exemplo: <b>10/31/2005</b>)<br/>
Duração: <input name="info.duration"/> (exemplo: <b>11:05 pm</b>)<br/>
<input type="submit"/>
</form>
</html>A página do resultado é converter/overriding.ok.jsp:
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
Conversão feita:
Data de início : <fmt:formatDate dateStyle="full" type="date" value="${info.startDate.time}"/><br/>
Duraçaõ: <fmt:formatDate timeStyle="full" type="time" value="${info.duration.time}"/><br/>
</html>