Return HTTP 204 on null with spring @RestController

前端 未结 7 2026
旧时难觅i
旧时难觅i 2020-12-25 12:10

This returns 200 OK with Content-Length: 0

@RestController
public class RepoController {
    @RequestMapping(value = \"/document/{id}\", method = RequestMeth         


        
7条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-25 12:43

    Question is old but for those that needs a global answer and have Spring 4+, you can create a ResponseBodyAdvice that changes response code base on the controller response. The following exemple do it for all @RestController classes :

    @ControllerAdvice(annotations = { RestController.class })
    public class NullToNoContentResponseBodyAdvice
        implements ResponseBodyAdvice
    {
        /**
         * {@inheritDoc}
         */
        @Override
        public Object beforeBodyWrite(final Object p_responseBodyObject, final MethodParameter p_methodParameter,
                                      final MediaType p_mediaType, final Class> p_class,
                                      final ServerHttpRequest p_serverHttpRequest,
                                      final ServerHttpResponse p_serverHttpResponse)
        {
            // ------------------------- DECLARE -------------------------- //
    
            if (p_responseBodyObject == null)
            {
                p_serverHttpResponse.setStatusCode(HttpStatus.NO_CONTENT);
            }
    
            // Always return object unchanged or it will break response
            return p_responseBodyObject;
        }
    
        /**
         * {@inheritDoc}
         */
        @Override
        public boolean supports(final MethodParameter p_methodParameter, final Class> p_class)
        {
            return AbstractGenericHttpMessageConverter.class.isAssignableFrom(p_class);
        }
    }
    
        

    提交回复
    热议问题