如何使用Response对象返回状态码?

时间:2020-10-12 00:11:37

标签: 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> response = new Response<>();
        response.setStatus(Status.UNAUTHORIZED);
        return response;
    }

控制器:

public Response fail(@RequestBody AuthRefreshRequest authRefreshRequest) throws Exception {
    return Response.unauthorized();
}

但返回状态始终为200

2 个答案:

答案 0 :(得分:1)

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

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

  1. 对响应的更细粒度控制:尽管返回的对象确实具有一些数据,但仍返回一些非200状态代码。

  2. 抛出异常并利用spring异常处理mvc集成。

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

Response对象中删除状态,通常倾向于删除此抽象级别:从控制器从业务域返回对象。 Spring已经有了这样的抽象:它叫做org.springframework.http.ResponseEntity

Assuming your have a "Payload" object:

public ResponseEntity<Payload> fail(...) {

   Payload payload = ...
   return new ResponseEntity(payload, HttpStatus.UNAUTHORIZED);
}

执行代码时,应使用 second 方法(基于异常),并且出现问题,以便服务器无法真正执行请求,并且从“业务逻辑”的角度来看“它会引发异常。

在这种情况下,您可能会引发包含某些消息,适用错误代码,状态代码或其他内容的异常,并放置一个控制器建议,该建议将在“释放”控制器后(在堆栈跟踪方面)拦截该异常-它是一个允许“自定义”响应的钩子:放置状态代码,标头,构建响应主体等。这种“控制器建议”是处理在Spring MVC中以异常结束的流程的一种方法,但是总之,还有很多其他方法,在Spring MVC中,异常处理是一个广泛的主题,因此,如果需要,请考虑阅读{{ 3}}(例如,还有很多)。

答案 1 :(得分:0)

您可以通过添加响应拦截器ResponseBodyAdvice来实现此目的,其中将返回状态设置为响应对象中的status代码:

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

相关问题