返回 HTTP 204 空值,并带有弹簧@RestController

这将返回 200 OK,内容长度:0

@RestController
public class RepoController {
    @RequestMapping(value = "/document/{id}", method = RequestMethod.GET)
    public Object getDocument(@PathVariable long id) {
       return null;
    }

}

简单地说,我希望它返回204 No Content on null。

有没有办法强制spring-mvc/rest在null而不是200上返回204?我不想更改每个 rest 方法以返回 ResponseEntity 或类似的东西,只需将 null 映射到 204


答案 1

您可以使用@ResponseStatus批注。这样,您就可以拥有 void 方法,而不必构建响应实体。

@DeleteMapping(value = HERO_MAPPING)
@ResponseStatus(value = HttpStatus.NO_CONTENT)
public void delete(@PathVariable Long heroId) {
    heroService.delete(heroId);
}

当对象存在时,BTW返回200,返回204,否则在API REST设计方面有点不寻常。当找不到请求的对象时,通常会返回404(未找到)。这可以使用控制器设备来实现。

在Spring REST中,最好使用异常处理程序处理异常,而不是放置逻辑来决定响应状态等。这是使用@ControllerAdvice注释的示例:http://www.jcombat.com/spring/exception-handling-in-spring-restful-web-service


答案 2

当然可以。

选项 1 :

@RestController
public class RepoController {
    @RequestMapping(value = "/document/{id}", method = RequestMethod.GET)
    public Object getDocument(@PathVariable long id, HttpServletResponse response) {
       Object object = getObject();
       if( null == object ){
          response.setStatus( HttpStatus.SC_NO_CONTENT);
       }
       return object ;
    }
}

选项 2 :

@RestController
public class RepoController {
    @RequestMapping(value = "/document/{id}", method = RequestMethod.GET)
    public Object getDocument(@PathVariable long id) {
       Object object = getObject();
       if ( null == object ){
          return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
       }

       return object ;
    }
}

可能有拼写错误,但你明白这个概念。


推荐