Java Spring引导自定义通过抛出异常接收带有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

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

我的设计是,我有一个包含测试逻辑的服务类。我还有一个API控制器类,它实现了来自服务的方法

我目前的理解是,控制器可以使用异常响应不同的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);
    } 
}
@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嗨,谢谢你的意见。我认为过滤器应该工作。我会在我的服务类方法中应用它吗?