2016-06-15 2 views
0

Ich möchte eine Bibliothek erstellen, die den Json Inhalt der Anfrage und Antwort auf annotierten Spring Controller speichern wird.Get json Inhalt der Anfrage und Antwort auf annotierten Spring Controller

Also habe ich meine eigene Anmerkung @foo bauen und sie auf einigen Controllern setzen:

@Foo 
    @RequestMapping(method = RequestMethod.POST, value = "/doSomeThing", produces = { 
      MediaType.APPLICATION_JSON_VALUE, MediaType.TEXT_XML_VALUE, 
      MediaType.APPLICATION_XML_VALUE}) 
    public ResponseEntity<T> doSomething(/*some parameters*/) { 
     T t = doSomeJob(T.class); 
     return new ResponseEntity<T>(t, HttpStatus.OK); 
} 

Ich habe keine Garantie dafür, dass und Antwort verlangen, sind in Contrellor-Parameter! Und ich fange den Anruf auf jedem Controller mit dieser Annotation innerhalb eines @AfterReturning AOP Pointcut.

@Component 
@Aspect 
public class XYInterceptor 
@AfterReturning(
      pointcut = "execution(@my.annotation.Foo)") 
      public void doSomethingWithJsonContent(JoinPoint joinPoint) throws Throwable { 

      //How can i get json value of request and response here?  
} 

Wie kann ich Anfrage- und Antwort Inhalt in json formatiert (wie es ist senden/an den Client zurückgegeben)?

Danke für Ihre Hilfe!

Antwort

0

Nun, Sie müssen Anfrage und Antwort irgendwie zugänglich von Ihrer Controller-Methode, entweder über eine injizierte Klasse Mitglied, Methodenparameter oder Methode Rückgabewert. Es muss irgendwo sein. Da Sie nicht erklärt haben, woher Sie es erhalten möchten, kann ich einfach eine allgemeine Antwort veröffentlichen, die zeigt, wie man Methodenargumente bestimmt und den Wert aus einem @AfterReturning Hinweis zurückgibt. Wenn Sie die Frage mit detaillierteren Informationen aktualisieren, kann ich die Antwort auch entsprechend aktualisieren.

Mein Pointcut (der auskommentierte funktioniert auch, wählen Sie Ihren Favoriten) bindet den Rückgabewert an einen Parameter und geht davon aus, dass sowohl Anfrage als auch Antwort vom Typ String sind. Fühlen Sie sich frei, durch Ihren Liebling zu ersetzen. Darüber hinaus können Sie einen Parameter von Ihrer abgefangenen Methode (unabhängig davon, wo er sich in der Signatur befindet) an einen typisierten beratungsmethode-Parameter binden, wenn Sie wissen, dass der Parameter existiert und auch seinen (Super-) Typ kennt. Auf diese Weise können Sie die langsame und hässliche Schleife über getArgs() loswerden.

//@AfterReturning(pointcut = "execution(@my.annotation.Foo * *(..))", returning = "response") 
@AfterReturning(pointcut = "@annotation(my.annotation.Foo)", returning = "response") 
public void interceptRequest(String response, JoinPoint thisJoinPoint) { 
    System.out.println(thisJoinPoint); 
    for (Object arg : thisJoinPoint.getArgs()) { 
     if (arg instanceof String) 
      System.out.println(" request = " + arg); 
    } 
    System.out.println(" response = " + response); 
} 
Verwandte Themen