Ich habe ein kleines Beispiel in plain AspectJ erstellt, d. H. Ohne Spring.Ich habe sogar ein Dummy Response
Klasse nur um die grundlegenden Mechanismen hinter Aspekte gesteuerte Ausnahmebehandlung zu zeigen:
Dummy Response-Klasse:
package de.scrum_master.app;
public class Response {
private int statusCode;
private String message;
public Response(int statusCode) {
this.statusCode = statusCode;
switch (statusCode) {
case 200:
message = "OK";
break;
case 202:
message = "Accepted";
break;
case 401:
message = "Unauthorized";
break;
default:
message = "Unknown status";
}
}
public int getStatusCode() {
return statusCode;
}
@Override
public String toString() {
return "Response(statusCode=" + statusCode + ", message=" + message + ")";
}
}
Treiber-Anwendung mit zwei Methoden abgefangen werden:
Wie Sie sehen können, werfen beide Methoden zufällig Ausnahmen, die später von einem Aspekt erfasst werden sollten.
package de.scrum_master.app;
import java.util.Random;
public class RestService {
private static final Random RANDOM = new Random();
public Response someRequest() {
Response response = new Response(RANDOM.nextBoolean() ? 200 : 401);
if (response.getStatusCode() != 200)
throw new RuntimeException("request failed: " + response);
return response;
}
public Response anotherRequest(String argument) {
Response response = new Response(RANDOM.nextBoolean() ? 200 : 401);
if (response.getStatusCode() != 200)
throw new RuntimeException("request failed: " + response);
return response;
}
public static void main(String[] args) {
RestService restService = new RestService();
for (int i = 0; i < 3; i++) {
System.out.println(restService.someRequest());
System.out.println(restService.anotherRequest("foo"));
}
}
}
Ausnahmebehandlung Aspekt:
package de.scrum_master.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import de.scrum_master.app.Response;
@Aspect
public class ResponseErrorHandler {
@Around("execution(de.scrum_master.app.Response *(..))")
public Response handleError(ProceedingJoinPoint thisJoinPoint) {
System.out.println("\n" + thisJoinPoint);
try {
return (Response) thisJoinPoint.proceed();
}
catch (Exception e) {
System.out.println(" Handling exception: " + e.getMessage());
return new Response(202);
}
}
}
Konsolenprotokoll:
execution(Response de.scrum_master.app.RestService.someRequest())
Response(statusCode=200, message=OK)
execution(Response de.scrum_master.app.RestService.anotherRequest(String))
Response(statusCode=200, message=OK)
execution(Response de.scrum_master.app.RestService.someRequest())
Response(statusCode=200, message=OK)
execution(Response de.scrum_master.app.RestService.anotherRequest(String))
Handling exception: request failed: Response(statusCode=401, message=Unauthorized)
Response(statusCode=202, message=Accepted)
execution(Response de.scrum_master.app.RestService.someRequest())
Response(statusCode=200, message=OK)
execution(Response de.scrum_master.app.RestService.anotherRequest(String))
Handling exception: request failed: Response(statusCode=401, message=Unauthorized)
Response(statusCode=202, message=Accepted)
Fühlen Sie sich frei Follow-up-Fragen zu stellen, wenn Sie die Antwort nicht verstehen.
Sie fangen entweder an dem Punkt, an dem die Ausnahme auftreten soll, oder Sie fangen irgendwo weiter oben im Aufruf-Stack ein. –
Mögliche Duplikate von [Vermeiden Sie leere Catch-Blöcke, wenn Sie eine Ausnahme erwarten] (http://stackoverflow.com/questions/38468125/avoid-empty-catch-blocks-when-expecting-exception) –
Wie Sie mit Feder sind, empfehle ich Ihnen um dies zu betrachten https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc suchst du so etwas? – user902383