Spring Boot自定义通过throw异常接收HTTP OPTIONS的响应

时间:2017-06-27 22:02:38

标签: java spring spring-mvc spring-boot

我是Spring Boot的新手,我正在尝试使用HTTP OPTIONS测试连接。

我的设计是我有一个Service类,其中包含测试的逻辑。我还有一个API Controller类,它实现了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()方法中添加更多内容?

1 个答案:

答案 0 :(得分: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方法有多种方法。但概念上相同。