2016-06-10 6 views
3

Ich habe eine Spring-App, die Hibernate und die Spring Data JPA CrudRepository verwendet. Alles scheint ordnungsgemäß zu funktionieren, wenn die Daten, nach denen gesucht wurde, in der Datenbank vorhanden sind. Wenn es jedoch eine Abfrage gibt, die kein Ergebnis liefert, gibt CrudRepositorynull zurück und ich bekomme NullPointerException. So zum Beispiel http://localhost:8080/api/id=3 wenn es eine Zeile mit ID 3 in der Datenbank gibt, funktioniert es gut. Wenn es keine Zeile mit der ID von 3 ist nicht mit ein:So behandeln Sie leeren Ergebnissatz mit Ruhezustand und Spring Boot

war ein unerwarteter Fehler (type = Internal Server Error, status = 500)

Auf der Clientseite und a NullPointerException auf der Serverseite.

Wie ist der richtige Umgang mit einem einfachen Fall einer Abfrage "Keine Ergebnisse"?

+1

zurückgeben 404 nicht gefunden. –

+0

Können Sie Ihren Ansatz näher erläutern? –

Antwort

10

Untersuchen Sie den Rückgabewert, wenn es nicht null ist, geben Sie eine Darstellung davon als eine 200 OK Antwort zurück. Andernfalls geben Sie 404 Not Found zurück. Am Ende müssten Sie einen Controller wie:

@RequestMapping(...) 
public ResponseEntity<?> getOne(...) { 
    Something something = repository.findOne(...); 
    if (something == null) 
     return ResponseEntity.notFound().build(); 

    return ResponseEntity.ok(something); 
} 


Sie den obigen Code Refactoring können Java-8s Optional<T>, wie JB Nizet im comments erwähnt zu integrieren. Grundsätzlich ist Optional<T> nur ein Container, der einen Wert vom Typ T enthalten kann oder nicht. Sie können diese Art als Rückgabetyp von Spring Data JPA Methoden verwenden, etwa wie folgt:

public interface SomethingRepository extends CrudRepository<Something, Long> { 
    Optional<Something> findById(Long id); 
} 

Dann für 404 Not Found eine Ausnahme definieren:

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class NotFoundException extends RuntimeException {} 

Wenn Sie eine Ausnahme vom Typ NotFoundException einwerfen Ihre Controller, Spring MVC Exception Resolver würde diese Ausnahme fangen und es in eine 404 Not Found HTTP-Antwort konvertieren.

Schließlich Ihr Controller wäre wie:

@RequestMapping(...) 
public Something getOne(...) { 
    return repository.findById(id).orElseThrow(NotFoundException::new); 
} 


Für detailliertere Diskussionen über:

+1

Oder Sie können eine Ausnahme auslösen und eine Ausnahme mit '@ResponseStatus (HttpStatus.NOT_FOUND)' kommentieren lassen. Kombiniert mit der Möglichkeit, dass Spring-data-jpa eine leere Option anstelle von null zurückgibt, können Sie Folgendes verwenden: 'Etwas etwas = etwasRepository.findById (id) .oderElseThrow (NotFoundException :: new);' –

+0

@JBNizet Yeap, das ist ein großartige Idee. –

+0

@JBNizet Die Antwort wurde mit Ihrem Vorschlag aktualisiert. Danke –

1

Keine der Spring-Crud-Repository-Methoden finden eine Ausnahme, wenn keine Ergebnisse zurückgegeben werden. Sie alle geben Nullen zurück. Da Sie eine Nullzeiger-Ausnahme auf der Serverseite erhalten, müssen Sie versuchen, eine Operation für den zurückgegebenen Wert auszuführen, ohne zu prüfen, ob sie zuerst null ist.

Verwandte Themen