J'ai un contrôleur de repos contient de nombreuses méthodes
@RestController @RequestMapping("v1/test") public class TestRestController { ...... 100 methods (GET, POST, PATCH, etc) }
Comment puis-je savoir à quelle méthode accède sans utiliser print
dans chaque méthode?
Y a-t-il des moyens de le faire?
3 Réponses :
Vous pouvez utiliser Spring AOP:
package com.example; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class ExampleAspect { @Before("execution(* com.example.TestRestController(..)") public void log(JoinPoint joinPoint) { System.out.println("Executing :" + joinPoint.toString()); } }
Utilisation de la programmation orientée aspect avec Spring:
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Aspect public class SpringAspect { private static final Logger LOG = LoggerFactory.getLogger(SpringAspect.class); @Before("execution(* sample.package.path.TestRestController.*(..))") public void executedMethodsLogger(JoinPoint joinPoint) { LOG.info("[ Executed method {} ]", joinPoint.toString()); } }
Bien que vous puissiez utiliser les tactiques AOP indiquées dans les autres réponses pour consigner les méthodes, il existe de meilleures approches si tout ce que vous voulez faire est de consigner toutes les demandes et réponses pour les points de terminaison que ces méthodes implémentent. Cela peut être fait de plusieurs manières: Utilisez CommonRequestLoggingFilter de Spring ou écrivez votre propre HandlerInterceptor. Voici un bel article sur les deux premières options.
Essayez-vous spécifiquement de le limiter à cette classe uniquement ou la journalisation de tous les appels est-elle correcte? (Notez également que même pour "tester" une classe avec autant de méthodes est folle ; séparez-les.)
J'avais répondu à une question pour obtenir des détails sur la méthode du contrôleur utilisant Spring AOP ici
Cela fonctionnera-t-il sur @Controller?
@BunthaiDeng Oui, vous devez modifier le code en conséquence. Votre question concerne RestController, non?
c'était juste une question supplémentaire. Merci, je comprends.