在Rest API中找不到处理资源 - java

我正在春季启动中开发Rest API。当找不到资源实例时,以下哪种方法是最好的处理方式?

    @GetMapping(value="/book/{id}")
    public ResponseEntity<Book> getBook(@PathVariable String id){

        Book book = bookService.getBook();

        // Which is best Approach for resource instance not found ?
        if(book == null) {
            // This one
            return new ResponseEntity<>(book, HttpStatus.NO_CONTENT);
            //OR
            return  new ResponseEntity<>(book, HttpStatus.NOT_FOUND);
            //OR 
            throw new DataNotFoundException("Book with id " + id + " Does not exist");
        }

        return new ResponseEntity<>(book , HttpStatus.OK);
    }

我很清楚,当在Db中找不到资源集合时,要传递一个空集合而不是null,但是我不清楚如何处理资源实例。

我还读过StackOverflow,当条件下的资源不存在而不是Db中不存在时,应使用HttpStatus.NOT_FOUND

处理此问题的最佳方法是什么?

参考方案

使用Spring MVC时,返回结果时通常有两种选择,要么使用普通对象,要么使用ResponseEntity类。这些都不是比另一个更好。此外,您可以决定是否使用异常将错误处理分开。

鉴于此,您抛出异常的第三个场景与前两个选项之一基本相同。默认情况下,引发异常将导致500内部服务器错误,但是可以使用@ResponseStatus批注来更改它,例如:

 @ResponseStatus(HttpStatus.NOT_FOUND) // Or @ResponseStatus(HttpStatus.NO_CONTENT)
 public class DataNotFoundException extends RuntimeException {

 }

另外,您也可以定义一个异常处理程序。同样,这可以通过使用普通对象或ResponseEntity完成,例如:

@ResponseStatus(HttpStatus.NOT_FOUND) // Or @ResponseStatus(HttpStatus.NO_CONTENT)
@ExceptionHandler(DataNotFoundException.class)
public Book handleNotFound(DataNotFoundException ex) {
    return null;
}

要么:

@ExceptionHandler(DataNotFoundException.class)
public ResponseEntity<Book> handleNotFound(DataNotFoundException ex) {
    return new ResponseEntity<>(null, HttpStatus.NOT_FOUND); // Or HttpStatus.NO_CONTENT
}

再次强调,两者都不比对方更好,您选择的内容主要取决于个人偏好。但是,您可能应该始终使用一个。

现在,这意味着还剩下两个选择,可以选择HttpStatus.NOT_FOUND(404)或HttpStatus.NO_CONTENT(204)。从技术上讲,您可以使用两种状态,但它们具有不同的含义:

204 =请求成功,但是没有任何响应。
404 =请求不成功,资源不存在

现在,如果您请求/book/123并且没有ID为123的书,则可以将其视为不存在的资源,因此HttpStatus.NOT_FOUND最有意义。

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

IntelliJ Spring MVC教程部署 - java

我尝试了tutorial,当我尝试部署webapp(IntelliJ 13.1.4 Ultimate)时,出现了一个奇怪的错误,如下面的屏幕快照所示。解决此错误的方法是什么? org.jdom.input.JDOMParseException: Error on line 742: The content of elements must consist o…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…