Exceptions générés lors de mise à jour d'un formulaire
Bonjour !
Dans ma page jsf, j'ai un formulaire pour enregistrer dans ma base de données.
Code:
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:
1 2 3 4 5 6 7 8
|
public String doUpdate() {
try {
ejb.edit(typeSpectacles);
} catch (Exception e) {
addMessage(e);
}
} |
- dans mon stateless
Code:
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:
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:
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:
<h:messages id="msgs" />
Toutefois, si je regarde du côté Glassfich, j'ai trace d'erreur comme ceci :
Citation:
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 :
Citation:
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 ?
:roll:
Et surtout, si c'est pas une mise à jour, et donc un nouvel enregistrement,
Code:
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