如何将状态代码设置为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
答案 0 :(得分:1)
默认情况下,如果您从@RestController
弹簧返回对象,则将其转换为JSON / XML并在响应中添加http状态代码200。这是有道理的,因为在没有抛出异常的意义上说,流并没有“异常地”结束。
从概念上讲,有两种方法可以更改此行为:
对响应的更细粒度控制:尽管返回的对象确实具有一些数据,但仍返回一些非200状态代码。
抛出异常并利用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;
}
}