9

Lassen Sie uns sagen, ich habe ein Repository wie:Wie kann ich Ausnahmen mit Spring Data Rest und dem PagingAndSortingRepository behandeln?

public interface MyRepository extends PagingAndSortingRepository<MyEntity, String> { 

    @Query("....") 
    Page<MyEntity> findByCustomField(@Param("customField") String customField, Pageable pageable); 
} 

Dies funktioniert gut. Wenn der Client jedoch eine gebildete Anforderung sendet (z. B. nach einem Feld sucht, das nicht existiert), gibt Spring die Ausnahme als JSON zurück. Aufdecken der @Query usw.

// This is OK 
http://example.com/data-rest/search/findByCustomField?customField=ABC 

// This is also OK because "secondField" is a valid column and is mapped via the Query 
http://example.com/data-rest/search/findByCustomField?customField=ABC&sort=secondField 

// This throws an exception and sends the exception to the client 
http://example.com/data-rest/search/findByCustomField?customField=ABC&sort=blahblah 

Ein Beispiel für die Ausnahme an den Client geworfen und gesendet:

{ 
    message:null, 
    cause: { 
     message: 'org.hibernate.QueryException: could not resolve property: blahblah...' 
    } 
} 

Wie kann ich diese Ausnahmen zu behandeln? Normalerweise verwende ich die @ExceptionHandler für meine MVC-Controller, aber ich verwende keine Schicht zwischen der Data Rest API und dem Client. Sollte ich?

Danke.

Antwort

1

zurückkehren Sie eine globales @ExceptionHandler mit der @ControllerAdvice Annotation nutzen könnten. Im Grunde definieren Sie, welche Ausnahme mit @ExceptionHandler innerhalb der Klasse mit @ControllerAdvice-Annotation behandelt werden soll, und dann implementieren Sie, was Sie tun möchten, wenn diese Ausnahme ausgelöst wird.

So:

@ControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class) 
public class GlobalExceptionHandler { 

    @ExceptionHandler({QueryException.class}) 
    public ResponseEntity<Map<String, String>> yourExceptionHandler(QueryException e) { 
     Map<String, String> response = new HashMap<String, String>(); 
     response.put("message", "Bad Request"); 
     return new ResponseEntity<Map<String, String>>(response, HttpStatus.BAD_REQUEST); //Bad Request example 
    } 
} 

Siehe auch: http://www.ekiras.com/2016/02/how-to-do-exception-handling-in-springboot-rest-application.html

1

Sie könnten @ControllerAdvice verwenden und den Inhalt auf Ihre Weise rendern. Hier Tutorial, wenn Sie wissen müssen, wie auf ControllerAdvice arbeiten, nur nicht vergessen, HttpEntity

+1

Link zum Tutorial fehlt –

Verwandte Themen