9

比方說,我有一個像倉庫:如何使用Spring Data Rest和PagingAndSortingRepository處理異常?

public interface MyRepository extends PagingAndSortingRepository<MyEntity, String> { 

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

這個偉大的工程。但是,如果客戶端發送一個形成的請求(比如說,在一個不存在的字段上搜索),那麼Spring會以JSON的形式返回異常。揭示了@Query

// 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 

拋出發送到客戶端異常的例子:

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

我如何處理這些例外?通常情況下,我爲我的MVC控制器使用@ExceptionHandler,但我沒有在Data Rest API和客戶端之間使用一層。我是不是該?

謝謝。

回答

1

你可以使用一個全球@ExceptionHandler@ControllerAdvice註解。基本上,您可以使用@ControllerAdvice批註在類中定義要使用@ExceptionHandler處理哪個異常,然後在拋出異常時實現您想要執行的操作。

像這樣:

@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 
    } 
} 

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

1

您可以使用@ControllerAdvice並以您的方式呈現內容。這裏是教程,如果你需要知道如何在ControllerAdvice,你要記得返回HttpEntity

+1

鏈接到教程丟失 –