Java 在Spring MVC中,当“get by id”未找到任何项时,如何优雅地处理Validate.notNull IllegalArgumentException?

Java 在Spring MVC中,当“get by id”未找到任何项时,如何优雅地处理Validate.notNull IllegalArgumentException?,java,hibernate,spring-mvc,error-handling,Java,Hibernate,Spring Mvc,Error Handling,我有一个Spring MVC web应用程序,并使用Hibernate进行持久化 我有一张车辆表。每辆车都有一个唯一的ID 我的应用程序中的一个网页列出了所有车辆www.example.com/vehicles。单击链接可通过车辆ID的GET参数www.example.com/vehicles?ID=1234进入该车辆的详细信息页面 这很好,因为如果从表中删除一辆车,该车将不再显示在列出所有车辆的页面上,因此没有可单击的链接 但是,如果有人提供了一个不存在的车辆id,例如,他们已将特定车辆的路径

我有一个Spring MVC web应用程序,并使用Hibernate进行持久化

我有一张车辆表。每辆车都有一个唯一的ID

我的应用程序中的一个网页列出了所有车辆www.example.com/vehicles。单击链接可通过车辆ID的GET参数www.example.com/vehicles?ID=1234进入该车辆的详细信息页面

这很好,因为如果从表中删除一辆车,该车将不再显示在列出所有车辆的页面上,因此没有可单击的链接

但是,如果有人提供了一个不存在的车辆id,例如,他们已将特定车辆的路径标记为书签,但该车辆已被删除,例如www.example.com/vehicles?id=1234,并且该车辆不再存在于数据库中,则存在例外情况

我的控制器将到达这两行,并在带有Validate.notNull的行上抛出IllegalArgumentException。 如何编写站点范围的处理程序,以便优雅地告诉网站访问者出现在Validate.notNull语句中的消息

我认为Validate.notNull语句在我的整个代码中都很有用,我希望将它们的消息一直发送到浏览器窗口,这样访问者就不会只看到一些通用的500错误页面

这不仅适用于我的Vehicles表,而且适用于任何内容

如果只需要一点代码就可以为整个站点的所有控制器优雅地处理这个问题,那就太好了


谢谢

我认为你不应该那样做。您要做的是处理从控制器传播出去的所有IllegalArgumentException,前提是它们都可以/应该报告给最终用户。这不是一个好的做法,因为Spring和其他库对所有事情都使用这个例外


你需要处理这是一个特殊情况。编写一个特殊的验证器来测试已删除的车辆案例,并让它抛出一个自定义异常。然后,要么在控制器中显式地处理,要么更一般地处理。

您应该在服务层中检查id的正确性。如果id不正确,抛出自定义异常并正确处理它

,我不是有意这么做的。但是我想知道我是否可以编写一些东西来代替Validate.notNull,它可以在任何对象上使用,并且可以用一条消息将用户跳转到错误页面。它将是void CheckForNullObject对象,String errorMessage,如果对象为null,则在特定视图上打印提供的错误消息。思想?我怎么能这么做?你可以这么做,但我认为这没用。问题在于,每个上下文都需要以不同的方式处理。有时,您希望将null视为非错误,而只是做一些不同的事情。有时您希望将其报告为错误的输入错误。有时您希望将其视为数据不可用错误。有时,您希望将其视为应用程序中存在错误。试图用一种机制来处理所有这些问题是行不通的。当然,我只会在期望的行为是将用户跳转到错误页面时使用它,其中提供的消息说您正在查找ID为[x]的项[item type],但它不存在。有点像404错误页面。在其他情况下,我会调用不同的方法以不同的方式处理空值。
Vehicle vehicle = vehicleDAO.findById(id);
Validate.notNull(vehicle, "There is no vehicle by this ID.");