2016-05-25 3 views
1

Ich habe ein Problem beim Versuch, Server-Fehler auf meinem Rest-Service verantwortlich für die Dateneinfügung zu behandeln.Play Framework-Fehler bei der Verwendung von runAsync

public CompletableFuture<Result> insertSomething() throws IOException { 
    JsonNode jsNode = request().body().asJson(); 
    format json node to be used 
    } 
    return CompletableFuture.runAsync(() -> { 
     try { 
      service.insertSomething(something); 
     } catch (ParseException e) { 
      internalServerError(); 
     } 
    }) 
      .thenApply(future -> created("data inserted")) 
      .exceptionally(ex -> internalServerError()); 
} 

Die internalServerError wird nie geworfen und es halten „Daten eingefügt“ sagen. Selbst wenn ich einige Daten sende, die die ParseException auslösen. Und im Debug-Modus sehe ich, wie es den Fang passiert, aber nichts wird geworfen.

Dankt im Voraus

Antwort

1

Ich habe die Antwort gefunden, und ich habe nur ein Objekt vom Typ Throwable in dem Fang so instanziiert:

public CompletableFuture<Result> insertSomething() throws IOException { 
JsonNode jsNode = request().body().asJson(); 
format json node to be used 
} 
return CompletableFuture.runAsync(() -> { 
    try { 
     service.insertSomething(something); 
    } catch (ParseException e) { 
     new Throwable(e.getMessage()); 
    } 
}) 
     .thenApply(future -> created("data inserted")) 
     .exceptionally(ex -> internalServerError()); 

}

+0

Eigentlich sind Sie nur den 'ParseException' dämpfen. Haben Sie vor, im 'catch' Block eine' throw' Anweisung zu schreiben? Wenn dies der Fall ist, müssen Sie eine 'RuntimeException' auslösen, und hier ist' CompletionException' am besten geeignet, z. 'Werfen Sie eine neue CompletionException (e);'. – acelent

0

Es ist, weil die Exception abgefangen wird. Wenn Sie einen Fehler ausgeben möchten, müssen Sie ihn nicht abfangen.

0

Natürlich wird nichts geworfen - fangen Sie es? Die exceptionally wird nur ausgeführt, wenn innerhalb runAsync eine Ausnahme geworfen wird, die durch den Code nicht behandelt wird.

Verwandte Themen