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.
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
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>
* <complexType name="log">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="acao" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="data" type="{http://www.w3.org/2001/XMLSchema}dateTime" minOccurs="0"/>
* <element name="descricao" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="id" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* <element name="usuario" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </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