Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Calendar Converter

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?

2 respostas

O primefaces não reconheceu o conversor declarado para classe. Alterei o meu conversos para:

@FacesConverter("calendarConverter")

e adicionei a chamada direta a esse conversor no campo do primefaces:

<p:calendar locale="pt" id="data2"
                        value="#{contratoBean.contrato.dataFim}" converter="calendarConverter" pattern="dd/MM/yyyy"
                        mask="true" />

Dessa forma, está funcionando.

solução!

Estou fechando a dúvida !

Qualquer coisa pode abrir outra !

Bons estudos