如何为映射的 HttpMethods Spring MVC @RestControllers 设置默认成功状态代码?
How to setup default success status codes for mapped HttpMethods Spring MVC @RestControllers?
你好Spring大师们,
目前我们正在用它自己的成功@ResponseStatus 注释每个映射的@RestController 方法。我想知道是否有可能基于映射的 @RequestMapping 方法进行全局设置。成功时我们希望:
- 获取 -> HttpStatus.OK
- POST -> HttpStatus.CREATED
- PUT -> HttpStatus.OK
- 补丁 -> HttpStatus.OK
- 删除 -> HttpStatus.NO_CONTENT
如果可能的话,我们必须做什么?
此致,
马吕斯
只需在您的方法上方使用注释
@ResponseStatus(value=org.springframework.http.HttpStatus.OK)
@ResponseStatus(value=org.springframework.http.HttpStatus.CREATED)
@ResponseStatus(value=org.springframework.http.HttpStatus.OK)
@ResponseStatus(value=org.springframework.http.HttpStatus.OK)
@ResponseStatus(value=org.springframework.http.HttpStatus.NO_CONTENT)
您可以使用 Filter
:
public class ResponseStatusConverterFilter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
chain.doFilter(request, response);
switch (request.getMethod()) {
case "GET": response.setStatus(200);
break;
case "POST": response.setStatus(201);
break;
...
}
}
并在 web.xml
中添加过滤器
<filter>
<filter-name>responseStatusConverterFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>responseStatusConverterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
请注意错误处理,因为这可能会覆盖错误响应代码。您应该在覆盖之前检查响应代码(例如,检查它是否是一些错误代码,如 500 或 404,然后不要将其设置为 200 或 201)。
另一种解法:
创建扩展 HandlerInterceptorAdapter
覆盖
的 bean
void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
throws Exception
并添加类似于我的第一个解决方案的逻辑。
将 bean 定义添加到:
<mvc:interceptors>
<bean class="com.your.web.ResponseConverterInterceptor" />
</mvc:interceptors>
附录: 您需要将 HttpServletResponse 与扩展 HttpServletResponseWrapper
的 class 包装起来:
public class StatusConvertingServletResponse extends HttpServletResponseWrapper {
private int httpStatus;
public StatusConvertingServletResponse(HttpServletResponse response) {
super(response);
}
@Override
public void setStatus(int sc) {
httpStatus = sc;
super.setStatus(sc);
}
@Override
public int getStatus() {
return httpStatus;
}
}
并像这样使用它:
StatusConvertingServletResponse res = new StatusConvertingServletResponse((HttpServletResponse)response);
chain.doFilter(request, res);
if (res.getStatus() == 200) {
res.setStatus(n);
}
您可以扩展 Spring @PostMapping
并添加默认 @ResponseStatus
即
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@PostMapping
@ResponseStatus(value = HttpStatus.CREATED)
public @interface CreatedPostMapping {
}
然后使用该注释代替 spring 注释,例如
@CreatedPostMapping
public String create() {
return "blah";
}
与其他 http 动词注释类似。
你好Spring大师们,
目前我们正在用它自己的成功@ResponseStatus 注释每个映射的@RestController 方法。我想知道是否有可能基于映射的 @RequestMapping 方法进行全局设置。成功时我们希望:
- 获取 -> HttpStatus.OK
- POST -> HttpStatus.CREATED
- PUT -> HttpStatus.OK
- 补丁 -> HttpStatus.OK
- 删除 -> HttpStatus.NO_CONTENT
如果可能的话,我们必须做什么?
此致, 马吕斯
只需在您的方法上方使用注释
@ResponseStatus(value=org.springframework.http.HttpStatus.OK)
@ResponseStatus(value=org.springframework.http.HttpStatus.CREATED)
@ResponseStatus(value=org.springframework.http.HttpStatus.OK)
@ResponseStatus(value=org.springframework.http.HttpStatus.OK)
@ResponseStatus(value=org.springframework.http.HttpStatus.NO_CONTENT)
您可以使用 Filter
:
public class ResponseStatusConverterFilter implements javax.servlet.Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
chain.doFilter(request, response);
switch (request.getMethod()) {
case "GET": response.setStatus(200);
break;
case "POST": response.setStatus(201);
break;
...
}
}
并在 web.xml
<filter>
<filter-name>responseStatusConverterFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>responseStatusConverterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
请注意错误处理,因为这可能会覆盖错误响应代码。您应该在覆盖之前检查响应代码(例如,检查它是否是一些错误代码,如 500 或 404,然后不要将其设置为 200 或 201)。
另一种解法:
创建扩展 HandlerInterceptorAdapter
覆盖
void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
throws Exception
并添加类似于我的第一个解决方案的逻辑。 将 bean 定义添加到:
<mvc:interceptors>
<bean class="com.your.web.ResponseConverterInterceptor" />
</mvc:interceptors>
附录: 您需要将 HttpServletResponse 与扩展 HttpServletResponseWrapper
的 class 包装起来:
public class StatusConvertingServletResponse extends HttpServletResponseWrapper {
private int httpStatus;
public StatusConvertingServletResponse(HttpServletResponse response) {
super(response);
}
@Override
public void setStatus(int sc) {
httpStatus = sc;
super.setStatus(sc);
}
@Override
public int getStatus() {
return httpStatus;
}
}
并像这样使用它:
StatusConvertingServletResponse res = new StatusConvertingServletResponse((HttpServletResponse)response);
chain.doFilter(request, res);
if (res.getStatus() == 200) {
res.setStatus(n);
}
您可以扩展 Spring @PostMapping
并添加默认 @ResponseStatus
即
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@PostMapping
@ResponseStatus(value = HttpStatus.CREATED)
public @interface CreatedPostMapping {
}
然后使用该注释代替 spring 注释,例如
@CreatedPostMapping
public String create() {
return "blah";
}
与其他 http 动词注释类似。