我是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()方法中添加更多内容?
答案 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方法有多种方法。但概念上相同。