Estou criando uma aplicação para fixar o conhecimento adquirido no curso. Criei o CalendarConverter, como mostrado no curso.
package br.com.mertens.helper;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.DateTimeConverter;
import javax.faces.convert.FacesConverter;
@FacesConverter(forClass=Calendar.class)
public class CalendarConverter implements Converter {
private DateTimeConverter converter = new DateTimeConverter();
public CalendarConverter() {
converter.setPattern("dd/MM/yyyy");
converter.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String dataString) {
Date data = (Date) converter.getAsObject(context, component, dataString);
Calendar calendar = Calendar.getInstance();
calendar.setTime(data);
return calendar;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object dataObject) {
if(dataObject == null)
return null;
Calendar calendar = (Calendar) dataObject;
return converter.getAsString(context, component, calendar.getTime());
}
}
O meu contrato, está conforme abaixo:
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import br.com.mertens.enumerados.TipoContrato;
@Entity
public class Contrato {
@Id
@GeneratedValue
private Integer idContrato;
@ManyToOne
private Jogador jogador;
@ManyToOne
private Time time;
@Temporal(TemporalType.DATE)
private Calendar dataInicio;
@Temporal(TemporalType.DATE)
private Calendar dataFim;
private TipoContrato tipoContrato;
public Integer getIdContrato() {
return idContrato;
}
public void setIdContrato(Integer idContrato) {
this.idContrato = idContrato;
}
public Jogador getJogador() {
return jogador;
}
public void setJogador(Jogador jogador) {
this.jogador = jogador;
}
public Time getTime() {
return time;
}
public void setTime(Time time) {
this.time = time;
}
public Calendar getDataInicio() {
return dataInicio;
}
public void setDataInicio(Calendar dataInicio) {
this.dataInicio = dataInicio;
}
public Calendar getDataFim() {
return dataFim;
}
public void setDataFim(Calendar dataFim) {
this.dataFim = dataFim;
}
public TipoContrato getTipoContrato() {
return tipoContrato;
}
public void setTipoContrato(TipoContrato tipoContrato) {
this.tipoContrato = tipoContrato;
}
}
E a minha tela de cadastro, usando um template, está como abaixo:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
template="/resources/template/_layout.xhtml">
<ui:define name="content">
<h:form id="formContrato">
<h:messages />
<p:panel header="Cadastro de Contrato">
<p:panelGrid columns="2">
<h:outputLabel value="Jogador:" for="itJogador" />
<p:outputLabel id="itJogador"
value="#{contratoBean.contrato.jogador.nomeJogador}" />
<p:outputLabel value="Time:" for="itTime" />
<p:autoComplete id="itTime" value="#{contratoBean.contrato.time}" completeMethod="#{autoCompleteTimes.completeTheme}"
var="time" itemLabel="#{time.nomeTime}" itemValue="#{time}" converter="timeConverter" forceSelection="true" />
<h:outputLabel value="Data de Inicio" />
<p:calendar locale="pt" id="data"
value="#{contratoBean.contrato.dataInicio}" pattern="dd/MM/yyyy"
mask="true" />
<h:outputLabel value="Data de Fim" />
<p:calendar locale="pt" id="data2"
value="#{contratoBean.contrato.dataFim}" pattern="dd/MM/yyyy"
mask="true" />
<h:outputLabel value="Tipo de Contrato" />
<h:selectOneRadio value="#{contratoBean.contrato.tipoContrato}">
<f:selectItems value="#{contratoBean.tipoContrato}" />
</h:selectOneRadio>
</p:panelGrid>
<h:commandButton value="Salvar" action="#{contratoBean.salvar}" />
</p:panel>
</h:form>
</ui:define>
</ui:composition>
No entanto, ao tentar cadastrar um contrato no sistema, recebo sempre a seguinte mensagem:
javax.el.ELException: /admin/contrato/cadastra.xhtml @25,21 value="#{contratoBean.contrato.dataInicio}": Cannot convert 01/03/17 00:00 of type class java.util.Date to class java.util.Calendar
Se eu colocar após os campos data inicio e data fim o Calendar.getInstance(), funciona.
O que estou deixando passar no meu processo?