Formatar XMLGregorianCalendar

7 respostas
0

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.

7 Respostas

Alexandre_Saudate

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

0

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

Obrigado!

Alexandre_Saudate

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

Obrigado!

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

0

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.

Alexandre_Saudate

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.

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

0

Segue

meu componente na interface:

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

Meu método do converter:

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;
	}

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!

Alexandre_Saudate

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

Criado 10 de outubro de 2012
Ultima resposta 11 de out. de 2012
Respostas 7
Participantes 2