Avant d'utiliser @Transaction
, mon modèle de code métier était probablement le suivant :
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);
try {
studentMapper.insertOnestdent(student);
logger.info("Insert one record successfully: " + student.toString());
} catch (Exception ex) {
dataSourceTransactionManager.rollback(transactionStatus);
// ex.printStackTrace();
logger.error("Insert one record unsuccessfully: " + student.toString());
return false;
}
dataSourceTransactionManager.commit(transactionStatus);
return true;
Semblable à ce qui précède, peu importe si mon opération de base de données ci-dessus est exécutée avec succès ou échoue, je peux obtenir des commentaires dans le journal.
Mais l'approche ci-dessus entraînera beaucoup de duplication de code.Vous pouvez utiliser l'aop fourni par spring pour implémenter une telle fonction de journalisation. Cependant, après avoir lu le document, j'ai découvert qu'il existe une annotation @Transaction
Utilisant cette annotation. le code peut être simplifié comme suit :
@Transactional(rollbackFor = Exception.class)
public boolean insertOneStudent(Student student) {
studentMapper.insertOneStudent(student);
logger.info("Insert one student successfully" + student.toString());
return true;
}
De cette façon, lorsque l'opération de base de données est exécutée avec succès, je peux l'enregistrer avec succès dans le journal Mais dans ce cas, comment dois-je l'enregistrer dans le journal lorsque l'opération d'insertion échoue ?
Mon idée initiale est maintenant d'implémenter manuellement une fonction de réflexion dynamique similaire à @Transaction
的动态反射的功能,这样每个要影响数据库中的数据修改的方法执行的时候我都在动态反射的invoke()
方法中进行异常的try catch
, de sorte que lorsque chaque méthode qui affecte la modification des données dans la base de données est exécutée, je reflète dynamiquement invoke()
La gestion des exceptions est effectué dans la méthode try catch
. Mais je ne sais pas si Spring a une telle fonction intégrée ?
p.s : Je fais de mon mieux pour gérer toutes les opérations et tous les traitements de la base de données au niveau service
, et je ne veux pas jeter les enregistrements de journaux ci-dessus.
insertOneStudent méthode entière try catch
Ou implémentez @RestControllerAdvice et imprimez les journaux d'exceptions de manière uniforme
Comme ceci :
Spring fournit également la gestion des exceptions d'aspect
Bien sûr, s'il y a une configuration XML, il y aura une configuration des annotations. Il y a principalement les commentaires suivants
@Aspect déclare la configuration de l'aspect
@Pointcut déclare les aspects
@Méthode de traitement des déclarations AfterThrowing
Remarques :
La classe qui gère les exceptions n'a pas besoin d'implémenter d'interface ni d'hériter d'une classe.
La méthode de gestion des exceptions doit déclarer deux paramètres (vous ne pouvez pas non plus la déclarer, les informations sur l'exception ne peuvent pas être obtenues), par exemple
Le paramètre joinPoint peut obtenir les informations sur le paramètre de méthode qui lève l'exception. Inutile de dire que l'objet Exception.
Le contenu ci-dessus est à titre de référence uniquement. Différentes versions de Spring peuvent rendre les instructions ci-dessus différentes de la situation réelle. Pour les instructions standard, veuillez vous référer à la documentation officielle de Spring