如何为映射的 HttpMethods Spring MVC @RestControllers 设置默认成功状态代码?

How to setup default success status codes for mapped HttpMethods Spring MVC @RestControllers?

你好Spring大师们,

目前我们正在用它自己的成功@ResponseStatus 注释每个映射的@RestController 方法。我想知道是否有可能基于映射的 @RequestMapping 方法进行全局设置。成功时我们希望:

如果可能的话,我们必须做什么?

此致, 马吕斯

只需在您的方法上方使用注释

@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 动词注释类似。