Formatar XMLGregorianCalendar

Ola galera!!!

Preciso fazer uma busca através de datas, para isso preciso formatar meu objeto do tipo XMLGregorianCalendar para ficar com o seguinte formato: dd/mm/yyyy.

Como faço isso?

Desde já agradeço.

O XMLGregorianCalendar só formata de acordo com o suportado por XML, ou seja, campos separados por traço. O que você pode fazer é usar tipos intermediários, como GregorianCalendar e Date, assim:

XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(new GregorianCalendar());
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
      String date = simpleDateFormat.format(xmlGregorianCalendar
            .toGregorianCalendar().getTime());
      System.out.println(date);

[]'s

1 curtida

Valeu Alexandre, mas eu preciso desse valor no objeto XMLGregorianCalendar e não em String, alguma outra opção?

Obrigado!

[quote=080808]Valeu Alexandre, mas eu preciso desse valor no objeto XMLGregorianCalendar e não em String, alguma outra opção?

Obrigado![/quote]

Qual a sua necessidade, especificamente? Você precisa trafegar a data com esse formato no XML, é isso?

Não, é o seguinte:

Tenho uma classe (model) com um campo do tipo XMLGregorianCalendar. No banco (Oracle) é salvo a data com a hora.

Tenho uma interface em JSF, uso um converter para renderizar a data na tela.

No meu componente de data (rich:calendar) informa data no padrão dd/MM/yyyy, quando passo o valor para o campo XMLGregorianCalendar ele fica no formato dele mesmo, algo do tipo 2012-10-10T23:45:50-03:00 (mesmo eu usando um SimpleDateFormat antes).

O problema é que uso uma busca com Example (do hibernate) passando a data escolhida na interface, mesmo eu colocando uma data de registros que contenha no banco, a busca não retorna nada. Preciso filtrar pela data e não estou conseguindo.

[quote=080808]Não, é o seguinte:

Tenho uma classe (model) com um campo do tipo XMLGregorianCalendar. No banco (Oracle) é salvo a data com a hora.

Tenho uma interface em JSF, uso um converter para renderizar a data na tela.

No meu componente de data (rich:calendar) informa data no padrão dd/MM/yyyy, quando passo o valor para o campo XMLGregorianCalendar ele fica no formato dele mesmo, algo do tipo 2012-10-10T23:45:50-03:00 (mesmo eu usando um SimpleDateFormat antes).

O problema é que uso uma busca com Example (do hibernate) passando a data escolhida na interface, mesmo eu colocando uma data de registros que contenha no banco, a busca não retorna nada. Preciso filtrar pela data e não estou conseguindo.[/quote]

Não estou entendendo muito bem, você poderia passar o código?

Segue

meu componente na interface:

<rich:calendar value="#{logBean.target.data}" datePattern="dd/MM/yyyy" converter="xmlGregorianCalendar" enableManualInput="true"/>

Meu método do converter:

[code]public Object getAsObject(FacesContext ctx, UIComponent component, String param) {
if (param == null || param.equals("")) {
return null;
}
formatDate.setLenient(false);

	Date date = null;

	String aux;
	if(param.length() == 8){
		aux = param.substring(0, 2) +"/"+param.substring(2, 4)+"/"+param.substring(4);
		param = aux;
	}
	else if (param.length() == 6){
		aux = param.substring(0, 2) +"/"+param.substring(2, 4)+"/20"+param.substring(4);
		param = aux;
	}

// param = param + " 00:00:00";

	try {
		date = formatDate.parse(param);
	} catch (ParseException e) {
		FacesUtil.addErrorMessage("Erro ao converter data");
		return null;
	}
	
	GregorianCalendar calendar = new GregorianCalendar();
	calendar.setTime(date);
	XMLGregorianCalendar value = null;
	
	//@@@@@@@@retirar dependecia se nao for usar
	//LocalDateTime result = DateTimeFormat.forPattern("dd/MM/yyyy").parseDateTime(param).toLocalDateTime();
	
	try {
		//value = DatatypeFactory.newInstance().newXMLGregorianCalendar(result.toDateTime().toGregorianCalendar());
		value = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
	} catch (DatatypeConfigurationException e) {
		FacesUtil.addErrorMessage("Erro ao converter data");
		return null;
	} 
	
	return value;
}

[/code]

meu client (a busca é feita via SOAP):


package br.com.ctbc.planeta.adm.service.client;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;


/**
 * <p>Java class for log complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="log">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="acao" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="data" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
 *         &lt;element name="descricao" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *         &lt;element name="id" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
 *         &lt;element name="usuario" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "log", propOrder = {
    "acao",
    "data",
    "descricao",
    "id",
    "usuario"
})
public class Log {

    protected String acao;
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar data;
    protected String descricao;
    protected Integer id;
    protected String usuario;

    /**
     * Gets the value of the acao property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getAcao() {
        return acao;
    }

    /**
     * Sets the value of the acao property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setAcao(String value) {
        this.acao = value;
    }

    /**
     * Gets the value of the data property.
     * 
     * @return
     *     possible object is
     *     {@link XMLGregorianCalendar }
     *     
     */
    public XMLGregorianCalendar getData() {
        return data;
    }

    /**
     * Sets the value of the data property.
     * 
     * @param value
     *     allowed object is
     *     {@link XMLGregorianCalendar }
     *     
     */
    public void setData(XMLGregorianCalendar value) {
        this.data = value;
    }

    /**
     * Gets the value of the descricao property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getDescricao() {
        return descricao;
    }

    /**
     * Sets the value of the descricao property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setDescricao(String value) {
        this.descricao = value;
    }

    /**
     * Gets the value of the id property.
     * 
     * @return
     *     possible object is
     *     {@link Integer }
     *     
     */
    public Integer getId() {
        return id;
    }

    /**
     * Sets the value of the id property.
     * 
     * @param value
     *     allowed object is
     *     {@link Integer }
     *     
     */
    public void setId(Integer value) {
        this.id = value;
    }

    /**
     * Gets the value of the usuario property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getUsuario() {
        return usuario;
    }

    /**
     * Sets the value of the usuario property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setUsuario(String value) {
        this.usuario = value;
    }

}

o model do serviço:

@Entity
@Table(name = "PREPAGO.CT_LOG")
public class Log implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@SequenceGenerator(name = "CT_LOG_SQ", sequenceName = "PREPAGO.CT_LOG_SQ", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CT_LOG_SQ")
	@Column(name = "CTCDLOG")
	private Integer id;
	@Column(name = "CTDTLOG", insertable=false)
	private Date data;
	@Column(name = "CTDEACAO")
	private String acao;
	@Column(name = "CTNMUSUARIO")
	private String usuario;
	@Column(name = "CTDELOG")
	private String descricao;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Date getData() {
		return data;
	}

	public void setData(Date data) {
		this.data = data;
	}

	public String getAcao() {
		return acao;
	}

	public void setAcao(String acao) {
		this.acao = acao;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Log other = (Log) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Log [id=" + id + ", data=" + data + ", acao=" + acao
				+ ", usuario=" + usuario + ", descricao=" + descricao + "]";
	}

}

e o método que uso para realizar a busca:

public List<Log> findAllByExample(Log exampleInstance,
			String[] excludeProperty) {
		Criteria crit = getSession().createCriteria(getPersistentClass());
		Example example = Example.create(exampleInstance);
		example.enableLike(MatchMode.ANYWHERE);
		example.ignoreCase();
		// example.excludeZeroes();
		for (String exclude : excludeProperty) {
			example.excludeProperty(exclude);
		}
		crit.add(example);
		return crit.list();
	}

Descrição da ação que faço:

Seleciono a data na interface, ela passa pelo converter e é setada no atributo data do client, feito isso, invoco o serviço e apartir daí passo a usar o model (utilizando jaxb) e invoco o método acima.

Todos os atributos que passo no client funciona, menos o atributo data, não estou conseguindo fazer com que a busca seja executada com sucesso passando a data.

Obrigado pela ajuda Alexandre!

OK, então, na verdade, provavelmente o que acontece é que o serviço não está conseguindo adaptar o formato da requisição (yyyy-MM-ddT etc.) para o formato da Data. Neste caso, você pode usar um Adapter XML (Exemplo do “como” : http://stackoverflow.com/questions/6020234/jaxb-complex-xml-unmarshall) para converter do XMLGregorianCalendar para Date (nesse caso, o Date que você usa no seu serviço).

[]'s