2017-06-01 132 views
2

我有一些奇怪的錯誤。Spring @ExceptionHandler返回HTTP 406

我想要做的事: 客戶詢問GET:/ invoices/invoiceNumber with header Accept:application/pdf,我想返回PDF文件。如果客戶端忘了標題,我將返回HTTP 406.

返回PDF字節的方法拋出由ExceptionHandler處理的DocumentNotFoundException,並且應該返回404,但它沒有。取而代之的是,我有406和服務器日誌:

2017-06-01 15:14:03.844 WARN 2272 --- [qtp245298614-13] o.e.jetty.server.handler.ErrorHandler : Error page loop /error 

同樣的奇蹟發生在春季安全返回HTTP 401

所以我認爲,問題是,客戶接受application/pdf,但春天的ExceptionHandler返回application/json ,所以碼頭調度覆蓋404與406 :(

我的代碼:

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Invoice not found") 
@ExceptionHandler(DocumentNotFoundException.class) 
public void handleException() { 
    //impl not needed 
} 

@GetMapping(value = "invoices/**", produces = MediaType.APPLICATION_PDF_VALUE) 
public ResponseEntity<byte[]> getInvoicePdf(HttpServletRequest request) { 
    String invoiceNumber = extractInvoiceNumber(request); 
    final byte[] invoicePdf = invoiceService.getInvoicePdf(invoiceNumber); 
    return new ResponseEntity<>(invoicePdf, buildPdfFileHeader(invoiceNumber), HttpStatus.OK); 

} 

@GetMapping(value = "invoices/**") 
public ResponseEntity getInvoiceOther() { 
    return new ResponseEntity<>(HttpStatus.NOT_ACCEPTABLE); 
} 

有人可以幫助我理解過程rstanding?

+0

讓你的客戶端接受'application/json' –

+0

我想根據客戶端Accept頭返回pdf或json元數據,所以我不能改變它。 –

回答

0

問題是,Spring試圖將錯誤響應轉換爲application/pdf,但未能找到合適的支持轉換爲PDF的HttpMessageConverter

的最簡單的解決方案是手動創建錯誤響應:

@ExceptionHandler(DocumentNotFoundException.class) 
public ResponseEntity<?> handleException(DocumentNotFoundException e) { 

    return ResponseEntity 
     .status(HttpStatus.NOT_FOUND) 
     .contentType(MediaType.APPLICATION_JSON_UTF8) 
     .body("{\"error\": \"Invoice not found\"}"); 
} 

這繞過消息轉換並導致HTTP 404響應代碼。

+0

是啊,這件事情我想和它的作品,但我想避免它,becouse: *我想返回錯誤cosistent的方式與別人端點 *在這種情況下,我應該爲所有可能的例外創建自定義異常處理程序,爲了返回前。 400,401,404等 –

+0

也許你應該嘗試[Spring Web MVC的問題](https://github.com/zalando/problem-spring-web)這是一個庫,它可以很容易地生成'application /來自Spring應用程序的問題+ json'響應。但是,如果我的答案解決了您的具體問題,請作爲回答upvote。 –

相關問題