Maison  >  Questions et réponses  >  le corps du texte

Comment enregistrer les exceptions au niveau @Transaction de Spring ?

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 @TransactionUtilisant 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.

某草草某草草2691 Il y a quelques jours637

répondre à tous(2)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-06-06 09:53:47

    insertOneStudent méthode entière try catch

    try {
    ...
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
        throw e;
    }

    Ou implémentez @RestControllerAdvice et imprimez les journaux d'exceptions de manière uniforme
    Comme ceci :

    @RestControllerAdvice
    public class MyExceptionHandler {
    
        @ExceptionHandler(value = Exception.class)
        public Object exceptionHandler(HttpServletRequest request,
                                             Exception exception) {
            logger.warn("异常:", exception);
            ...
        }
    }

    répondre
    0
  • 世界只因有你

    世界只因有你2017-06-06 09:53:47

    Spring fournit également la gestion des exceptions d'aspect

    <!--aop配置 -->
        <aop:config>
            <!-- 业务类切面 -->
            <aop:pointcut id="【切面ID】"
                expression="【这里填写切面的匹配规则】" />
            <!-- 异常处理 -->
            <aop:aspect ref="【处理异常的类ID】">
                <aop:after-throwing method="【处理异常的方法名称】" pointcut-ref="【切面ID】" throwing="e" />
            </aop:aspect>
        </aop:config>

    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 :

    1. La classe qui gère les exceptions n'a pas besoin d'implémenter d'interface ni d'hériter d'une classe.

    2. 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

      public void test(JoinPoint joinPoint, Exception e)

      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.

    3. 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

    4. .

    répondre
    0
  • Annulerrépondre