Spring 如何使用响应对象返回状态代码?
我应该如何将状态代码设置为401Spring 如何使用响应对象返回状态代码?,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
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添加到响应中。这是有意义的,因为流没有“异常地”结束,也就是说没有抛出异常
从概念上讲,有两种方法可以改变这种行为:
响应
对象中删除状态,通常倾向于删除此抽象级别:从控制器中从业务域返回对象。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);
}