gpt4 book ai didi

java - Spring Boot自定义通过抛出异常接收带有HTTP OPTIONS的响应

转载 作者:行者123 更新时间:2023-11-30 06:38:33 25 4
gpt4 key购买 nike

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

我的设计是有一个包含测试逻辑的服务类。我还有一个 API Controller 类,它实现了 Service 中的方法。

我目前的理解是 Controller 可用于使用异常来响应不同的 HTTP 状态。

这是我为此目的在 Controller 内编写的方法:

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

我已经创建了这些自定义异常类。

这是在 Controller 方法内触发正确 HTTP 响应的正确方法还是 Spring Boot 有其他设计?如果是这样,我的异常列表是否足够全面,或者我是否需要向服务类中的 testConnection() 方法添加更多内容?

最佳答案

您可以为每种异常类型编写 ExceptionHandler,因此您根本不必重复代码或使用 try/catch block 。只需让您的 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 方法有不同的方法。但概念上是一样的。

关于java - Spring Boot自定义通过抛出异常接收带有HTTP OPTIONS的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44790673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com