Constraint bean violation while...

Résolu/Fermé
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018 - Modifié le 25 avril 2017 à 18:31
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018 - 30 avril 2017 à 10:36
Bonjour,
je viens de metre une appliquation automatisation de cheque et j'ai mis en place un formulaire de ce formulaire devrait ajouter un nouveau fournisseur mais le problem lorsque je clique sur le bouton enregistrer une il m'affiche une erreur qui dit que:
Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.
je sais pas quoi faire si jamais vous avez rencontrer ce genre d'erreur quelqu'un peut m'orienter.
voici ma classe bean
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package beans;

import dao.*;
import entities.*;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.Dependent;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;


@Named(value = "fournisseurBean")
@Dependent
public class fournisseurBean {

    @EJB
    private FournisseurFacade fournisseurFacade;
    
    private List<Fournisseur> listeDeFournisseur = null;
    
    private Fournisseur fournisseur= null;
    
    public fournisseurBean() {
        fournisseur = new Fournisseur();
        listeDeFournisseur = new ArrayList<Fournisseur>();
    }

    public Fournisseur getFournisseur() {
        return fournisseur;
    }

    public void setFournisseur(Fournisseur fournisseur) {
        this.fournisseur = fournisseur;
    }

    public List<Fournisseur> getListeDeFournisseur() {
        return listeDeFournisseur = this.fournisseurFacade.findAll();
    }

    public void setListeDeFournisseur(List<Fournisseur> listeDeFournisseur) {
        this.listeDeFournisseur = listeDeFournisseur;
    }
    
    public String createFournisseur(){
        this.fournisseurFacade.create(fournisseur);
        this.fournisseur = new Fournisseur();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("You've registered"));
        return null;
    }
    
    
    
    
    
}


voici la page jsf correspondante
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
    <h:head>
        <title>Enrégistement Fournisseur</title>
        <h:outputStylesheet library="css" name="TP4_css_file.css"/>
    </h:head>
    <h:body>
        <div id="tailleapp">
            <h:form>
                <p:megaMenu autoDisplay="true">
                    <p:menuitem value="Accueil" url="../../principal_page.xhtml" icon="ui-icon-home"/>
                    <p:menuitem value="Quitter" url="../../principal_page.xhtml" icon="ui-icon-close"/>
                </p:megaMenu>
            </h:form>
            <br></br> 
            <h3>Bienvenu dans la page l'enregistrement des Fournisseur</h3>
            <div id="liste">
                <f:view>


                    <h:form>
                        <p:growl id="growl" />
                        <h1><h:outputText value="Create/Edit"/></h1>
                        <p:fieldset id="facture" legend="Information fournisseur" style="margin-top:20px">
                            <p:panelGrid columns="2">

                                <p:outputLabel value="Nom:" for="nom" />
                                <p:inputText id="nom" value="#{fournisseurBean.fournisseur.nom}" title="Nom" required="true" requiredMessage="The Nom field is required."/>
                                <p:outputLabel value="Telephone:" for="telephone" />
                                <p:inputMask id="telephone" value="#{fournisseurBean.fournisseur.telephone}" title="Telephone" required="true" requiredMessage="The Telephone field is required." mask="77999999"/>
                                <p:outputLabel value="Email:" for="email" />
                                <p:inputText id="email" value="#{fournisseurBean.fournisseur.email}" title="Email" required="true" requiredMessage="The Email field is required."/>
                                <p:outputLabel value="Adresse:" for="adresse" />
                                <p:inputText id="adresse" value="#{fournisseurBean.fournisseur.adresse}" title="Adresse" required="true" requiredMessage="The Adresse field is required."/>
                            </p:panelGrid>
                        </p:fieldset>
                        <p:commandButton value="Enregistrer" action="#{fournisseurBean.createFournisseur()}" icon="ui-icon-check" update="growl" ajax="false"/>
                    </h:form>
                </f:view>

                <div id="footer">
                    <ui:include src="../../WEB-INF/templ/templates/footer.xhtml"/>
                </div>
            </div>
        </div>
    </h:body>
</html>

voici l'entité fournisseur
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;


@Entity
@Table(name = "fournisseur")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Fournisseur.findAll", query = "SELECT f FROM Fournisseur f"),
    @NamedQuery(name = "Fournisseur.findById", query = "SELECT f FROM Fournisseur f WHERE f.id = :id"),
    @NamedQuery(name = "Fournisseur.findByNom", query = "SELECT f FROM Fournisseur f WHERE f.nom = :nom"),
    @NamedQuery(name = "Fournisseur.findByTelephone", query = "SELECT f FROM Fournisseur f WHERE f.telephone = :telephone"),
    @NamedQuery(name = "Fournisseur.findByEmail", query = "SELECT f FROM Fournisseur f WHERE f.email = :email"),
    @NamedQuery(name = "Fournisseur.findByAdresse", query = "SELECT f FROM Fournisseur f WHERE f.adresse = :adresse")})
public class Fournisseur implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "nom")
    private String nom;
    @Basic(optional = false)
    @NotNull
    @Column(name = "telephone")
    private int telephone;
    // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{| }~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{
|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "email")
    private String email;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 33)
    @Column(name = "adresse")
    private String adresse;
//le getters + et les setters et autre methode comme tostring()

s'il vous plait je besoin de votre aide merci.
A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
25 avril 2017 à 18:50
Bonjour,

Dans ton code tu as des
import javax.validation.constraints.*
dont tu te sers pour ajouter des contraintes à tes valeurs.

Par exemple
@Size(min = 1, max = 255)
impose que le
String nom
ait entre 1 et 255 caractères (si le nom est vide, ce n'est pas bon).

Si une ou plusieurs contraintes ne sont pas respectées le programme va lever une erreur de type
javax.validation.ConstraintViolationException
.

Voir https://docs.oracle.com/javaee/7/api/javax/validation/ConstraintViolationException.html

Voici comment récupérer les "embedded ConstraintViolations for details" :

try {
    // ...
} catch (ConstraintViolationException e) {
    Set<ConstraintViolation<?>> embeddedConstraintViolations = e.getConstraintViolations();
    for (ConstraintViolation details : embeddedConstraintViolations) {
        String message = details.getMessage();
        System.err.println(message);
    }
    throw e;
}
0
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018
26 avril 2017 à 10:47
Bonjour KX,
j'ai essayé d'inserer le bloc trycatch pour lever une exception dans ma methode qui enregistrait un fournisseut du coup j'ai toujours le meme soucie
voici ma methode apres l'insertion :
public String createFournisseur() {
try {
this.fournisseurFacade.create(fournisseur);
this.fournisseur = new Fournisseur();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Enrégistrement succes"));
} catch (ConstraintViolationException e) {
Set<ConstraintViolation<?>> embeddedConstraintViolations = e.getConstraintViolations();
for (ConstraintViolation details : embeddedConstraintViolations) {
String message = details.getMessage();
System.err.println(message);
}
throw e;
}

return null;
}

et d'autre part j'ai eu une methode qui permet de verifier l'exactitude des element ou les propriéte a inserer et la voila :
  private boolean constraintValidationsDetected(T entity) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(entity);
if (constraintViolations.size() > 0) {
Iterator<ConstraintViolation<T>> iterator = constraintViolations.iterator();
while (iterator.hasNext()) {
ConstraintViolation<T> cv = iterator.next();
System.err.println(cv.getRootBeanClass().getName() + "." + cv.getPropertyPath() + " " + cv.getMessage());


// JsfUtil.addErrorMessage(cv.getRootBeanClass().getSimpleName() + "." + cv.getPropertyPath() + " " + cv.getMessage());
}
return true;
}
else {
return false;
}
}

mais le problem dans ce code c'est dans mon cas il m'affiche une erreur a la ligne ou j'ai mit en commentaire double slashe et il dit de creer une class jsfutil dans le package dao donc pouvez m'explique pour cela c'est produit pour moi?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
26 avril 2017 à 18:41
" j'ai toujours le meme soucie "
C'est normal, le code que j'ai fait, tel que tu l'as rajouté fait un
throw e;
donc s'il y avait une exception on continuera de l'avoir, cependant ce qui est intéressant c'est l'affichage du message de violation qu'il doit y avoir en plus.
Remarque : le but n'est pas d'empêcher cette exception de se produire, car elle est normale, mais plutôt de comprendre pourquoi tu as une violation à ce moment là, et comment empêcher que cela se produise (probablement par des contrôles de surface).
0
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018 > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
26 avril 2017 à 19:02
Je comprend tout a fait votre sens mais c'est comment avoir les exception et par ou elles ont affichés ce que je cherche c'est j'ai simplement de stack trace qui apparait seul dont le seul est "Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details."
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
26 avril 2017 à 19:11
Tu dois également avoir le
System.err.println(message);
dans tes logs, ou sinon c'est que le try/catch est mal placé...

Tu peux également mettre un
throw new IllegalStateException(message, e);
dans ton catch, mais tu n'auras que la première erreur de validation dans la boucle, pas les suivantes s'il y en a d'autres.
0
adamsjilal Messages postés 46 Date d'inscription lundi 14 mars 2016 Statut Membre Dernière intervention 29 avril 2018
30 avril 2017 à 10:36
apres une longue travail, j'ai enfin trouvé la solution. pour mon cas le problem etait que je voulait enregistrer un champs vide avec nulll avec que dans la base de données cette champs etait declaré not null. dans ma entité j'ai simplement enlever le @notNull()
et ca a marcher. KX je vous remercie infiniment de m'orienter et de se donner le temps pour m'aider encor merci.
0