java.sql.Date et les web services
Bonjour,
Je suis entrain de développer un WebService sur le serveur d'application Glassfish. Et je suis confronté à un énorme problème, j'arrive pas à le résoudre. En effet, j'ai effectue un mapping Objet relationnel avec JPA entre les tables de ma base de données SQL Server 2005 et les classes Java de mon WebService. Dès lors que je déploie mon application, j'obtiens l'erreur suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Buildfile: C:\project\.metadata\.plugins\org.eclipse.jst.server.generic.core\serverdef\sunappsrv-ant.xml
deploy.j2ee.web:
tools:
deploydir:
[exec] CLI171 Échec de la commande deploydir : Déploiement de l'application dans le domaine a échoué ; Erreur de déploiementjava.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
[exec] java.sql.Date n'a pas de constructeur sans argument par défaut.
[exec] this problem is related to the following location:
[exec] at java.sql.Date
[exec] at public java.sql.Date datas.Produit.getDateDisponibilite()
[exec] at datas.Produit
[exec] at private java.util.List service.jaxws.SearchProductByCategoryResponse._return
[exec] at service.jaxws.SearchProductByCategoryResponse
[exec] -- Impossible de créer JAXBContext en raison de la restriction de sécurité
[echo] Application dir Deployed at: http://localhost:8080/compare
BUILD SUCCESSFUL
Total time: 4 seconds |
Et la classe mise en cause est la suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
| package datas;
import java.sql.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import service.Impl;
@Entity
@Table(name="produit")
public class Produit {
protected int idProduit;
protected String nom;
protected String modele;
protected double prix;
protected String lienUrl;
protected int quantite;
protected Date dateDisponibilite;
protected int poids;
protected Categorie categorie;
protected Fournisseur fournisseur;
@Id
@Column(name="IdProduit")
public int getIdProduit() {
return idProduit;
}
public void setIdProduit(int idProduit) {
this.idProduit = idProduit;
}
@Column(name="Nom")
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
@Column(name="Modele")
public String getModele() {
return modele;
}
public void setModele(String modele) {
this.modele = modele;
}
@Column(name="Prix")
public double getPrix() {
return prix;
}
public void setPrix(double prix) {
this.prix = prix;
}
@Column(name="LienUrl")
public String getLienUrl() {
return lienUrl;
}
public void setLienUrl(String lienUrl) {
this.lienUrl = lienUrl;
}
@Column(name="Quantite")
public int getQuantite() {
return quantite;
}
public void setQuantite(int quantite) {
this.quantite = quantite;
}
//@Transient
/*
@Column(name="dateDisponibilite")
public Date getDateDisponibilite() {
return dateDisponibilite;
}
public void setDateDisponibilite(Date dateDisponibilite) {
this.dateDisponibilite = dateDisponibilite;
}*/
@Column(name="Poids")
public int getPoids() {
return poids;
}
public void setPoids(int poids) {
this.poids = poids;
}
@ManyToOne
@JoinColumn(name="IdCategorie",referencedColumnName="IdCategorie")
public Categorie getCategorie() {
return categorie;
}
public void setCategorie(Categorie categorie) {
this.categorie = categorie;
}
@ManyToOne
@JoinColumn(name="IdFournisseur",referencedColumnName="IdFournisseur")
public Fournisseur getFournisseur() {
return fournisseur;
}
public void setFournisseur(Fournisseur fournisseur) {
this.fournisseur = fournisseur;
}
// Constructeurs
public Produit(){ }
public Produit(int idProduit, Categorie categorie, Date dateDisponibilite, Fournisseur fournisseur) {
this.dateDisponibilite = dateDisponibilite;
this.categorie = categorie;
this.fournisseur = fournisseur;
}
//Lecture d'un enregistrement dans la BD
public Produit lire(int id){
Produit pdt = null;
pdt = Impl.em.find(Produit.class, id);
if(pdt != null) return pdt;
else return null;
}
//Insertion un enregistrement dans la BD
public void ajouter(){
try{
Impl.em.getTransaction().begin();
Impl.em.persist(this);
Impl.em.getTransaction().commit();
} catch(Exception e){
Impl.em.getTransaction().rollback();
}
}
//Modification de l'enregistrement dans la BD
public void modifier(){
try{
Impl.em.getTransaction().begin();
Impl.em.flush();
Impl.em.getTransaction().commit();
} catch(Exception e){
Impl.em.getTransaction().rollback();
}
}
//Suppression l'enregistrement de la BD
public void supprimer(){
try{
Impl.em.getTransaction().begin();
Impl.em.refresh(this);
Impl.em.remove(this);
Impl.em.getTransaction().commit();
} catch(Exception e){
Impl.em.getTransaction().rollback();
}
}
} |
Merçi d'avance pour vos réponses.
Attention aux Dates dans les services Web
Dans les messages précédents on parle de Calendar , qui est conseillé en Java mais il faut penser que si votre service est à destination de client du monde entier il risque d'y avoir un décalage horaire, et Calendar en tient compte mais pas l'objet DateTime de XML vers lequel il sera converti automatiquement par votre frameworlk !!
Dans les bonnes pratiques des services Web on préfèrera l'objet java.util.Date ,voire une restriction par patern de l'objet string que l'on convertira en java.sql.Date pour l'insertion en base.
Hag