2017-06-27 66 views
1

我是Spring Boot的新手,我試圖使用HTTP OPTIONS來測試連接。Spring Boot自定義通過拋出異常接收HTTP選項的響應

我的設計是我有一個包含測試邏輯的Service類。我也有一個API控制器類來實現Service中的方法。

我目前的理解是,控制器可用於使用異常來回應不同的HTTP狀態。

這是我在控制器內部寫了這個目的的方法:

@PostMapping(path = "/test") 
public ResponseEntity<Void> testConnection(@RequestBody URL url) { 
    try { 
     ControllerService.testConnection(url); 
     return ResponseEntity.status(HttpStatus.NO_CONTENT).body(null); 
    } catch (CredentialsException e) { 
     return ResponseEntity.status(HttpStatus.FORBIDDEN).body(null); 
    } catch (URLException | URISyntaxException e) { 
     return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); 
    } catch (UnknownException e) { 
     return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); 
    } 
} 

異常觸發的方式和方法testConnection()是服務類中:

public static void testConnection(URL url) 
     throws URISyntaxException, CredentialsException, URLException, UnknownException { 

    String authHeaderValue = "Basic " + Base64.getEncoder().encodeToString(("user" + ':' + "password").getBytes()); 

    HttpHeaders requestHeaders = new HttpHeaders(); 
    requestHeaders.set("Authorization", authHeaderValue); 

    RestTemplate rest = new RestTemplate(); 
    final ResponseEntity<Object> optionsResponse = rest.exchange(url.toURI(), HttpMethod.OPTIONS, new HttpEntity<>(requestHeaders), Object.class); 
    int code = optionsResponse.getStatusCodeValue(); 

    if (code == 403) { 
     throw new InvalidCredentialsException(); 
    } else if (code == 404) { 
     throw new InvalidURLException(); 
    } else if (code == 500) { 
     throw new UnknownErrorException(); 
    } else if (code == 200){ 
     String message = "Test connection successful"; 
     LOGGER.info(message); 
    } 
} 

我有創建了這些自定義異常類。

這是在控制器方法內觸發正確的HTTP響應的正確方法還是Spring Boot有其他設計?如果是這樣,我的例外列表是否足夠全面或者是否需要向服務類中的testConnection()方法添加更多內容?

+0

我認爲你可以使用一些Java Filter來捕捉異常,併爲每個異常返回具有特定http狀態碼的響應。這對你有幫助嗎?我也有其他的想法。 – Dherik

+0

@Dherik嗨,感謝您的意見。我認爲過濾器應該工作。我會將它應用於我的Service類方法嗎? – pike

回答

1

您可以爲每種Exception類型編寫ExceptionHandler,因此您不必重複代碼或使用try/catch塊。只要讓你的testConnection和其他方法拋出異常。

import org.springframework.web.bind.annotation.ExceptionHandler; 

@ExceptionHandler(CredentialsException.class) 
public void credentialsExceptionHandler(CredentialsException e, HttpServletResponse response) throws IOException { 
    response.sendError(HttpStatus.FORBIDDEN.value(), e.getMessage()); 
} 

有不同的方法來定義和使用ExceptionHandler方法。但概念上相同。

相關問題