Wie protokolliere ich Ausnahmen auf der @Transaction-Ebene von Spring?
某草草
某草草 2017-06-06 09:51:47
0
2
618

Bevor ich@Transactionverwendete, sah mein Geschäftscodemodell wahrscheinlich wie folgt aus:

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;

Ähnlich wie oben kann ich im Protokoll eine Rückmeldung erhalten, unabhängig davon, ob mein obiger Datenbankvorgang erfolgreich ausgeführt wurde oder fehlschlägt.

Der obige Ansatz führt jedoch zu einer großen Codeduplizierung. Als ich mir das Dokument später ansah, stellte ich fest, dass es eine@Transaction-Anmerkung gibt , der Code kann wie folgt vereinfacht werden:

@Transactional(rollbackFor = Exception.class) public boolean insertOneStudent(Student student) { studentMapper.insertOneStudent(student); logger.info("Insert one student successfully" + student.toString()); return true; }

Auf diese Weise kann ich den Datenbankvorgang erfolgreich im Protokoll aufzeichnen.Aber wie soll ich ihn in diesem Fall im Protokoll aufzeichnen, wenn der Einfügevorgang fehlschlägt?

Meine erste Idee besteht nun darin, eine dynamische Reflexionsfunktion ähnlich wie@Transaction的动态反射的功能,这样每个要影响数据库中的数据修改的方法执行的时候我都在动态反射的invoke()方法中进行异常的try catchmanuell zu implementieren, sodass ich bei der Ausführung jeder Methode, die sich auf die Datenänderung in der Datenbank auswirkt, die Ausnahmebehandlunginvoke()dynamisch widerspiegelt wird in der Methodetry Catchausgeführt.Aber ich weiß nicht, ob der Frühling eine solche eingebaute Funktion hat?

ps.s: Ich versuche mein Bestes, alle Datenbankoperationen und -verarbeitungen auf derservice-Ebene abzuwickeln, und möchte keine Protokolldatensätze nach oben werfen.

某草草
某草草

Antworte allen (2)
伊谢尔伦

insertOneStudent方法整个try catch

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

或者实现@RestControllerAdvice,在里面统一打印异常日志
像这样:

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

    spring也有提供切面的异常处理

            

    当然,有xml配置就会有注解配置。主要有下面几个注解

    • @Aspect 声明切面配置

    • @Pointcut 声明切面

    • @AfterThrowing 声明处理方法

    注意事项:

    1. 处理异常的类是不需要实现任何接口和继承任何类的。

    2. 处理异常的方法要声明两个参数(不声明也可以,获取不了异常信息而已),举个例子

      public void test(JoinPoint joinPoint, Exception e)

      其中joinPoint参数可以获取抛出异常的方法参数信息,Exception对象就不用说了吧。

    3. 以上内容仅做参考,spring的版本不同也可能会导致上述说明和实际情况有差异,想获取标准的说明请参阅Spring的官方文档

      Neueste Downloads
      Mehr>
      Web-Effekte
      Quellcode der Website
      Website-Materialien
      Frontend-Vorlage
      Über uns Haftungsausschluss Sitemap
      Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!