2017-11-25 4 views
0

Ich bin neu bei Spring-Boot und AOP. Ich versuche, die Ausnahmen, die in meiner spring-boot Anwendung ausgelöst werden, zu protokollieren. Was genau ich versuche zu tun ist, wann immer eine Methode in meinen Anwendungsklassen die Laufzeitausnahme auslöst, ich logge sie in die Konsole ein.spring-boot- @AfterThrowing führt keine beratungsmethode durch, obwohl eine Ausnahme ausgelöst wird?

Also habe ich einen Aspekt mit @AfterThrowing Annotation erstellt. Um zu überprüfen, ob es funktioniert, habe ich absichtlich eine Codezeile geschrieben, die / by zero Exception auslösen wird. Ich habe es getestet, aber diese Methode funktioniert nicht.

Es folgt mein Testcode:

package com.sware.SpringBoot_JPA_MySQL_Gradle_Project.aspects; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.springframework.stereotype.Component; 

import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User; 

@Aspect 
@Component 
public class UserAspect { 


    @Before("execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.UserService.saveUserToDb(com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User)) && args(user)") 
    public void beforeUserSave(User user) { 
     System.out.println("++++++++++++++++++++++++++++++Creating UserBefore Pointcut: \n"+user.toString()); 

    } 



    @After("execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.UserService.saveUserToDb(com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User)) && args(user)") 
     public void aftereUserSave(User user) { 
     System.out.println("++++++++++++++++++++++++++++++Creating User After pointcut: \n"+user.toString()); 

     } 

    @AfterThrowing(pointcut = "execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.*.*(..))", throwing = "e") 
    public void myAfterThrowing(JoinPoint joinPoint, Throwable e) { 

     System.out.println("Okay - we're in the handler..."); 

     /*Signature signature = joinPoint.getSignature(); 
     String methodName = signature.getName(); 
     String stuff = signature.toString(); 
     String arguments = Arrays.toString(joinPoint.getArgs()); 
    System.out.println("**************************EXCEPTION: " 
      + methodName + " with arguments " 
      + arguments + "\nand the full toString: " + stuff + "\nthe exception is: " 
      + e.getMessage());*/ 
    } 
} 

i mehrere Permutationen von pointcut Ausdruck wie unten versucht, aber niemand arbeitet:

@AfterThrowing(pointcut = "execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.*.*(..))", throwing = "e") 
@AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "e") // Application fails to start throws some internal null pointer exception 
@AfterThrowing(pointcut = "execution(* com.sware.*.*.*.*(..))", throwing = "e") 

Mein Klassencode:

package com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services; 
    import java.util.ArrayList; 
    import java.util.Collection; 
    import java.util.Date; 
    import java.util.List; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.stereotype.Service; 
    import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User; 
    import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.projections.UserWithFnameAndLname; 
    import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.repositories.UserRepository; 

    @Service 
    public class UserService { 
     @Autowired 
     UserRepository userRepository; 
     public List<User> getAllUsers(){ 

      List<User> userList=new ArrayList<>(); 
      try { 
       Integer n=10/0; 
       userList=userRepository.findAll(); 

      } catch (Exception e) { 
       System.out.println("Exception in UserRepostory:"+e.getMessage()); 
      } 
      return userList; 
     } 
    } 

Hier, myAfterThrowing Methode wird nicht Anruf obwohl /by zero wird beim Ausführen ausgelöst Zeit. Kann mir jemand sagen, wo ich falsch liege?

+0

Nicht genug Informationen - können Sie die Feder Sanitär (Anwendungs-Kontext, JavaConfig ...) – Sanj

+0

Eigentlich benutze ich 'Spring-Boot', so dass es keine Konfiguration getan. Ich habe nur die Abhängigkeit von Großbuchstaben in build.gradle, kompilieren ("org.aspectj: aspectjweaver: 1.8.8"). Die beiden anderen "@before" - und "@after" -Positionsschnitte funktionieren einwandfrei. –

+1

Methode wirft keine Ausnahme. Der "try-catch" -Block absorbiert grundsätzlich die Ausnahme. Move "Ganzzahl n = 10/0;" außerhalb des Try-Catch. – Sanj

Antwort

0

Methode wirft keine Ausnahme. Der "try-catch" -Block absorbiert grundsätzlich die Ausnahme. Move "Integer n=10/0;" außerhalb des Try-Catch

Verwandte Themen