Bonjour !

Dans ma page jsf, j'ai un formulaire pour enregistrer dans ma base de données.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
     <h:messages id="msgs" />
     <h:form id="frmList">
           ...
           <h:inputText id="newCode" value="#{typeSpectaclesController.typeSpectacles.code}" maxlength="4" size="4" />
           ...
           <h:commandButton type="submit" value="Valider" action="#{typeSpectaclesController.doUpdate}" />
     </h>


Si un champ est mal renseigné, ou si il y a des doublons (etc...), je lève ma propre exception dont le message s'affichera dans ma page jsf :

- dans mon controller :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
    public String doUpdate() {
        try {
            ejb.edit(typeSpectacles);
        } catch (Exception e) {
            addMessage(e);
        }
    }
- dans mon stateless
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
    public void edit(TypeSpectacles typeSpectacles) () {
          getEntityManager().merge(typeSpectacles);
    }
- dans mon entité, j'ai ma fonction avec annotations qui contrôle avant enregistrement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
    @PrePersist
    @PreUpdate
    private void controlData() {
 
        if (code == null || "".equals(code))
            throw new ValidationException("Code invalide !");
 
        if (libelle == null || "".equals(libelle))
            throw new ValidationException("Libellé invalide !");
 
    }
- et la définition de mon exception telle que
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
@ApplicationException(rollback = true)
public class ValidationException extends RuntimeException {
    public ValidationException(String msg) {
        super(msg);
    }
}

Au final, je valide mon formulaire lors d'une mise à jour avec mes champs à vide, et j'ai bien mon message qui s'affiche sans la mise à jour !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<h:messages id="msgs" />


Toutefois, si je regarde du côté Glassfich, j'ai trace d'erreur comme ceci :
ATTENTION: DTX5014: Caught exception in beforeCompletion() callback:
exception.ValidationException: Libellé invalide !
at .entity.TypeSpectacles.controlData(TypeSpectacles.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.invokeMethod(PrivilegedAccessHelper.java:346)
at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityListener.invokeMethod(EntityListener.java:297)
at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityClassListener.invokeMethod(EntityClassListener.java:64)
at org.eclipse.persistence.internal.jpa.metadata.listeners.EntityListener.preUpdateWithChanges(EntityListener.java:413)
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:676)
at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:606)
at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:200)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.updateObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:1078)
at org.eclipse.persistence.queries.UpdateObjectQuery.executeCommitWithChangeSet(UpdateObjectQuery.java:84)
at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:286)
at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:675)
at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:589)
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:109)
at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:86)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2857)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1225)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1207)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1167)
at org.eclipse.persistence.internal.sessions.CommitManager.commitChangedObjectsForClassWithChangeSet(CommitManager.java:233)
at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:108)
at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:3260)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1403)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:547)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1508)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3128)
at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:268)
at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:157)
at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:68)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:412)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:837)
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5040)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4805)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
at $Proxy177.edit(Unknown Source)
....

Donc je cherche DTX5014 et chez sun :
DTX5014 Caught exception in beforeCompletion() callback:

Cause:
Exception occurred while calling beforeCompletion() method of the registered synchronization

Solution:
Check exception message for the exact cause of the exception

Alors je laisse et c'est simplement un avertissement ?!
Ou il y a quelque chose à faire ?




Et surtout, si c'est pas une mise à jour, et donc un nouvel enregistrement,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
    //dans le stateless
    public void create(TypeSpectacles typeSpectacles) {
        getEntityManager().persist(typeSpectacles);
    }
pas de "traces"... tout nickel



Donc rien d'alarmant, mais si on peut faire les choses bien...

Merci