Ich verwende Spring Boot, um einen REST-Dienst zu schreiben. Ich muss eine andere Entität zurückgeben, wenn eine Operation erfolgreich ist und entsprechend fehlschlägt. ResponseEntity
im Frühjahr wird durch den Typ T
parametriert. Ich weiß, ich kann die Art weglassen und nur ResponseEntity
zurückkehren, aber das ist nicht genug, wenn man versucht, die Antwort mit Java 8 Optional
‚s orElse
Kette zu schaffen:Anderen generischen Typ mit Optional.map.orElse zurückgeben
public ResponseEntity getDashboard(String user, UUID uuid) {
Optional<Dashboard> dashboard = dashboardService.getDashboard(user, uuid);
// this gives unchecked assignment: 'org.springframework.http.ResponseEntity'
// to 'org.springframework.http.ResponseEntity<my.package.SomeClass>'
return dashboard
.map(ResponseEntity::ok)
.orElse(createNotFoundResponse(uuid, "No such object"));
}
public static <T> ResponseEntity createNotFoundResp(T entity, String message) {
ResponseMessage<T> responseMessage = new ResponseMessage<>(message, entity);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(responseMessage);
}
Aufgrund Java Compiler Typinferenz orElse
Klausel sollte die Rückkehr gleicher Typ wie wenn das optionale nicht leer ist, dh ResponseEntity<Dashboard>
und nicht ResponseEntity<ResponseMessage>
. Ich habe versucht, dieses Problem zu unterlaufen, die von verschiedenen Rückwegen wie diese bieten:
if (dashboard.isPresent()) {
return ResponseEntity.ok(dashboard.get());
} else {
return createNotFoundResponse(uuid, "No such object");
}
... aber dann Intellij unterstreicht den dashboard.isPresent()
Teil und schreit, dass dieser Block den oben vereinfacht werden kann (was in nicht kontrollierten Warnung führt).
Gibt es eine Möglichkeit, diesen Code ohne Compiler-Warnungen und @SuppressUnchecked
Annotationen sauber zu schreiben?
Das Hinzufügen von '>' zu 'ResponseEntity' in den Signaturen von ** beiden Methoden ** führte dazu, dass die Warnung für mich wegging. – slim
"Gibt es eine Möglichkeit, diesen Code ohne Compiler-Warnungen sauber zu schreiben?" Ja, mit dem if/else. Intellij ist falsch. (Mein intellij schlägt diese "Vereinfachung" nicht vor). –
@AndyTurner stimmen nicht zu. 'if (x.isPresent() {return f (x.get());} else {return y;}' ist ein Antipattern. 'return x.map (F: f) .oderElse (y)' is The Right Thing To Do. – slim