在 spring 中出现错误时设置响应正文

Set response body in case of error in spring

我在 spring 中有一个 api,返回一个字节数组。万一有什么错误,是不是logical/possible加个response body?

例如:

@GetMapping(value = ["path"], produces = ["application/pdf"])
@ResponseBody
fun method(@PathVariable("varib") var: String?,
           request: HttpServletRequest?, response: 
HttpServletResponse?): ByteArray? {

   // some method which will return a byte arrat
    return pdf
}

@ExceptionHandler(RUnTimeException::class)
fun errorHandler(e: Exception,response: ServletRespons) {
response?.setHeader('someheader','value')
}

是否可以在异常情况下添加响应正文?来自 'errorHandler' 方法内部?合乎逻辑吗?

您可以添加 ControllerAdvice:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
@Slf4j
public class ExceptionHandlingAdvice {
    private final Clock clock = Clock.systemDefaultZone();

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        return handleException(ex.getLocalizedMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    private ResponseEntity<ErrorResponse> handleException(String message, HttpStatus httpStatus) {
        log.error("Error: " + message);
        ErrorResponse errorResponse = ErrorResponse.of(Instant.now(clock), message);
        return new ResponseEntity<>(errorResponse, httpStatus);
    }
}

根据您使用的 Spring 版本,您不需要 @ResponseBody。您应该使用 @ControllerAdvice 来帮助管理不同层(存储库、服务、控制器)中的所有异常。您可以定义代表您的 @Responsebody 的自定义响应消息。希望这篇可以帮到你。