Spring 如何使用响应对象返回状态代码?

Spring 如何使用响应对象返回状态代码?,spring,spring-boot,Spring,Spring Boot,我应该如何将状态代码设置为401 public class Response<T> { private Status status; private T payload; private Object errors; private Object metadata; public static <T> Response<T> unauthorized() { Response<T> res

我应该如何将状态代码设置为401

public class Response<T> {

    private Status status;
    private T payload;
    private Object errors;
    private Object metadata;

    public static <T> Response<T> unauthorized() {
        Response<T> response = new Response<>();
        response.setStatus(Status.UNAUTHORIZED);
        return response;
    }

但是返回状态始终为200

您可以通过添加响应拦截器来实现这一点,在该拦截器中,将返回状态设置为响应对象中的
状态
代码:

@ControllerAdvice
public class ResponseIntercepter implements ResponseBodyAdvice<Response> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Response beforeBodyWrite(Response body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        // here set the return status (need to convert your own Status to org.springframework.http.HttpStatus)
        serverHttpResponse.setStatusCode(body.getStatus());
        return body;
    }
}

@ControllerAdvice
公共类ResponseIntercepter实现ResponseByAdvice{
@凌驾
公共布尔支持(MethodParameter,类>aClass){
返回true;
}
@凌驾
BodyWrite之前的公共响应(响应正文、MethodParameter MethodParameter、MediaType MediaType、Class>aClass、ServerHttpRequest ServerHttpRequest、ServerHttpResponse ServerHttpResponse){
//这里设置返回状态(需要将您自己的状态转换为org.springframework.http.HttpStatus)
serverHttpResponse.setStatusCode(body.getStatus());
返回体;
}
}

默认情况下,如果从
@RestController
返回对象,spring会将其转换为JSON/XML,并将http状态代码200添加到响应中。这是有意义的,因为流没有“异常地”结束,也就是说没有抛出异常

从概念上讲,有两种方法可以改变这种行为:

  • 对响应进行更细粒度的控制:尽管返回的对象确实有一些数据,但返回一些非200状态代码

  • 抛出异常并利用spring异常处理mvc集成

  • 第一种方法可以通过简单的重构轻松完成:

    响应
    对象中删除状态,通常倾向于删除此抽象级别:从控制器中从业务域返回对象。Spring已经有了这样一个抽象:它被称为
    org.springframework.http.ResponseEntity

    Assuming your have a "Payload" object:
    
    public ResponseEntity<Payload> fail(...) {
    
       Payload payload = ...
       return new ResponseEntity(payload, HttpStatus.UNAUTHORIZED);
    }
    
    
    假设您有一个“负载”对象:
    公共响应失败(…){
    有效载荷=。。。
    返回新的响应状态(有效负载,HttpStatus.UNAUTHORIZED);
    }
    
    当您执行代码时,如果出现问题,则应使用第二种方法(基于异常),这样服务器就无法真正执行请求,并且从“业务逻辑角度”来看,它会抛出异常


    在这种情况下,您可以抛出包含一些消息、应用程序错误代码、状态代码或其他内容的异常,并放置一个控制器建议,在异常“离开”控制器后拦截该异常(根据堆栈跟踪)——这是一个允许“自定义”响应的钩子:放置状态代码、头、构建响应体,无论什么这个“Controller Advices”是处理在Spring MVC中以异常结束的流程的方法之一,但是还有很多其他的,总之,异常处理在Spring MVC中是一个广泛的主题,所以如果您需要,例如考虑阅读(还有很多其他的)。这个响应对象充其量是不明确的——这与在spring引导下运行的spring mvc有关吗?
    Assuming your have a "Payload" object:
    
    public ResponseEntity<Payload> fail(...) {
    
       Payload payload = ...
       return new ResponseEntity(payload, HttpStatus.UNAUTHORIZED);
    }