代码之家  ›  专栏  ›  技术社区  ›  mad_fox

弹簧MVC-当静止控制器响应类型无效时自动返回204

  •  2
  • mad_fox  · 技术社区  · 7 年前

    void . 前任:

    @DeleteMapping(value = "/{heroId}")
    public void delete(@PathVariable Long heroId) {
        heroService.delete(heroId);
    }
    

    我正在寻找一种自动返回204的方法,而不必使用 @ResponseStatus(value = HttpStatus.NO_CONTENT) .

    我看到了这个答案, Return HTTP 204 on null with spring @RestController ,但没有回答我的具体问题,即如何为具有 无效的 返回类型。此外,此方法应与没有输入参数的方法一起使用。

    2 回复  |  直到 7 年前
        1
  •  5
  •   mad_fox    7 年前

    我能够基于Yoshua提供的链接实现一个解决方案。我不能百分之百确定具体的实施细节,但这对我来说是可行的。

    void 并将其HTTP状态更改为204。

    import org.springframework.core.MethodParameter;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    @ControllerAdvice
    public class NoContentControllerAdvice implements ResponseBodyAdvice<Void> {
    
        @Override
        public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
            if(returnType.getParameterType().isAssignableFrom(void.class)) {
                return true;
            }
    
            return false;
        }
    
    
    
        @Override
        public Void beforeBodyWrite(Void body, MethodParameter returnType, MediaType mediaType,
                Class<? extends HttpMessageConverter<?>> converterType, ServerHttpRequest request, ServerHttpResponse response) {
    
            if(returnType.getParameterType().isAssignableFrom(void.class)) {
                response.setStatusCode(HttpStatus.NO_CONTENT);
            }
    
            return body;
        }
    }
    
        2
  •  4
  •   piepera    5 年前

    我看到这个问题已经得到了回答,但这个解决方案更干净一些:

    import org.springframework.core.MethodParameter;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    @ControllerAdvice
    public class NoContentControllerAdvice implements ResponseBodyAdvice<Void> {
    
      @Override
      public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return returnType.getParameterType() == void.class;
      }
    
      @Override
      public Void beforeBodyWrite(Void body, MethodParameter returnType, MediaType selectedContentType,
          Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        response.setStatusCode(HttpStatus.NO_CONTENT);
        return body;
      }
    }