Java Spring引导自定义通过抛出异常接收带有HTTP选项的响应
我是Spring Boot新手,我正在尝试使用HTTP选项测试连接 我的设计是,我有一个包含测试逻辑的服务类。我还有一个API控制器类,它实现了来自服务的方法 我目前的理解是,控制器可以使用异常响应不同的HTTP状态 这是我在控制器中为此编写的方法:Java Spring引导自定义通过抛出异常接收带有HTTP选项的响应,java,spring,spring-mvc,spring-boot,Java,Spring,Spring Mvc,Spring Boot,我是Spring Boot新手,我正在尝试使用HTTP选项测试连接 我的设计是,我有一个包含测试逻辑的服务类。我还有一个API控制器类,它实现了来自服务的方法 我目前的理解是,控制器可以使用异常响应不同的HTTP状态 这是我在控制器中为此编写的方法: @PostMapping(path = "/test") public ResponseEntity<Void> testConnection(@RequestBody URL url) { try { Cont
@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);
}
}
@PostMapping(path=“/test”)
公共响应性测试连接(@RequestBody URL){
试一试{
ControllerService.testConnection(url);
返回ResponseEntity.status(HttpStatus.NO_CONTENT).body(null);
}捕获(证书例外){
返回ResponseEntity.status(HttpStatus.FORBIDDEN).body(null);
}catch(URLException | URISyntaxException e){
返回ResponseEntity.status(HttpStatus.NOT_FOUND).body(null);
}捕获(未知异常e){
返回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);
}
}
publicstaticvoidtestconnection(URL)
抛出URISyntaxException、credentialexception、URLException、UnknownException{
字符串authHeaderValue=“Basic”+Base64.getEncoder().encodeToString((“用户“+”:“+”密码”).getBytes();
HttpHeaders requestHeaders=新的HttpHeaders();
requestHeaders.set(“授权”,authHeaderValue);
RestTemplate rest=新建RestTemplate();
final ResponseEntity OPTIONS response=rest.exchange(url.toURI(),HttpMethod.OPTIONS,新的HttpEntity(requestHeaders),Object.class);
int code=optionResponse.getStatusCodeValue();
如果(代码==403){
抛出新的InvalidCredentialsException();
}否则如果(代码==404){
抛出新的InvalidURLException();
}否则,如果(代码==500){
抛出新的UnknownErrorException();
}否则,如果(代码==200){
String message=“测试连接成功”;
LOGGER.info(消息);
}
}
我已经创建了这些自定义异常类
这是在控制器方法中触发正确HTTP响应的正确方法,还是Spring Boot有其他设计?如果是这样,我的异常列表是否足够全面,或者我是否需要向服务类中的testConnection()方法添加更多内容?您可以为每个异常类型编写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方法。但概念上是一样的 我认为您可以使用一些java过滤器来捕获异常,并返回一个响应,其中包含每个异常的特定http状态代码。这对你有帮助吗?基于此,我也有其他想法。@Dherik嗨,谢谢你的意见。我认为过滤器应该工作。我会在我的服务类方法中应用它吗?