当前位置: 首页 > 面试题库 >

如何使用Hibernate和Spring Boot正确处理空结果集

洪英豪
2023-03-14
问题内容

我有一个使用Hibernate和Spring Data
JPA的Spring应用程序CrudRepository。如果查询的数据存在于数据库中,则一切似乎都能正常工作。但是,如果存在不返回任何结果的查询,则CrudRepository返回,null并且我得到一个NullPointerException。因此,例如,http://localhost:8080/api/id=3如果数据库中有一个ID为3的行,它就可以正常工作。如果没有ID为3的行,它将失败并显示:

发生意外错误(类型=内部服务器错误,状态= 500)

在客户端和NullPointerException服务器端。

处理“无结果”查询的简单情况的正确方法是什么?


问题答案:

检查返回值,如果不是null,则返回它的某种表示形式作为200 OK响应。否则,返回404 Not Found。最后,您将拥有一个像这样的控制器:

@RequestMapping(...)
public ResponseEntity<?> getOne(...) {
    Something something = repository.findOne(...);
    if (something == null)
        return ResponseEntity.notFound().build();

    return ResponseEntity.ok(something);
}

您可以重构前面的代码以合并Java 8 Optional<T>,如JB
Nizet
在评论中所述。基本上,Optional<T>它只是一个可能包含或可能不包含type值的容器T。您可以使用此类型作为Spring
Data JPA方法的返回类型,如下所示:

public interface SomethingRepository extends CrudRepository<Something, Long> {
    Optional<Something> findById(Long id);
}

然后为404 Not Found以下项定义一个例外:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {}

如果NotFoundException在控制器中引发类型异常,Spring MVC的异常解析器将捕获该异常并将其转换为404 Not FoundHTTP响应。

最终,您的控制器将像:

@RequestMapping(...)
public Something getOne(...) {
    return repository.findById(id).orElseThrow(NotFoundException::new);
}

有关以下内容的详细讨论:

  • Spring Data JPA的Optional<T>支持,请在此处阅读。
  • Spring MVC的异常解析器,请阅读此处。
  • Java 8 Optional<T>,在这里阅读。
  • REST最佳实践,您可以查看REST in Practice书。


 类似资料:
  • 我已经将我的nodejs应用程序配置为使用MongoDB。我可以成功地连接和添加数据到我的mongodb实例。我的应用程序配置如下(敏感信息编辑): 如果我点击endpoint,那么pizza文档就会很好地在数据库中创建,但我注意到连接从未关闭;这意味着endpoint从不将“all good”字符串作为响应发送。而且,对的任何后续请求都会抛出以下错误: 我似乎没有正确处理promise和asyn

  • 基本上,我正在使用spring boot和thymeleaf创建一个餐厅餐饮网站(只是一个课程的练习),厨师提供自助餐,每个自助餐由不同的菜肴和不同的配料组成(对不起,我的英语)。 我的问题是:我应该使用来指示厨师制作的自助餐吗? 或者我应该直接使用(“/自助餐”)?因为对于配料的控制器,我最终会使用<代码>(“/厨师/{id}/自助餐/{id}/盘子{id}/配料”) ,它看起来很奇怪,但我认为

  • 我试图更好地理解JPA/Hibernate和SQL服务器的注释。 我创建了一个简单的项目:一个名为“Articles”的抽象类。有两个类继承了它:Ramette添加了权重,Pen添加了颜色。下面的代码无效,我无法更正错误。你有什么想法吗?非常感谢。

  • 问题内容: 昨天我对一个问题的回答之一是建议我确保我的数据库可以正确处理UTF-8字符。我该如何使用MySQL? 问题答案: 更新: 简短答案-您几乎应该始终使用字符集和排序规则。 更改数据库: 看到: 亚伦对此答案的评论如何使MySQL正确处理UTF-8 utf8_general_ci和utf8_unicode_ci有什么区别 转换指南:https : //dev.mysql.com/doc/r

  • 问题内容: 在代码中 和功能get_info: 在更大的范围内 关于返回mysql数据并将其分配给变量,我缺少什么? =============根据Alex建议的新代码 ====正在使用新代码 然而 在函数外部的作用域中,parent_id为null 问题答案: 您将需要使用javascript进行异步调用和回调,这不是c#/ php等。 这是使用您的代码的示例: 当您依次调用此函数时,将调用co

  • 在 node.js中,通常的做法是将错误消息作为回调函数的第一个参数返回。在纯JS中有许多解决方案(promise,步骤,seq等),但它们似乎都无法与ICS集成。在不损失太多可读性的情况下处理错误的正确解决方案是什么? 例如:

  • 如果我有以下代码,这是关闭Connection、ResultSet和语句对象的正确方式吗?我觉得所有对的调用都应该在最终块中。

  • 我试图找到正确的方法来使用工人围棋例程产生的结果,同时在所有工作完成后优雅地退出结果循环。为了说明,我做了以下示例。我的真实世界案例与这个例子略有不同,因为我不知道每个工人围棋例程将返回多少“工作”,显然这些for循环执行固定数量的结果(5)。 我是goroutines和频道的新手,但以下是我所理解的基本租户; 只有发送者才能关闭频道 在通道上执行将继续,直到通道关闭 这个例子是死锁,因为范围循环