当前位置: 首页 > 知识库问答 >
问题:

我如何添加错误到我的spring MVC REST服务?

郑伟彦
2023-03-14

如果用户没有输入我编码的两个名称,我如何改变/更新以下来自spring MVC的REST调用以返回一个错误…像是找不到的东西?

@RequestMapping(value = "/{name}", method = RequestMethod.GET)
    @ResponseBody
    public User getName(@PathVariable String name, ModelMap model)
    {

        logger.debug("I am in the controller and got user name: " + name);

        /*

            Simulate a successful lookup for 2 users, this is where your real lookup code would go

         */

        if ("name2".equals(name))
        {
            return new User("real name 2", name);
        }

        if ("name1".equals(name))
        {
            return new User("real name 1", name);
        }


        return null;
    }

共有2个答案

邓深
2023-03-14

您可以创建一个专门用于返回错误响应的对象。那样,你想说什么就说什么。例如:

@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<ResponseStatus> handleHttpMessageNotReadableException(HttpMessageNotReadableException ex){

    ResponseStatus responseStatus = new ResponseStatus("400", "Bad Request. " + ex);
    responseStatus.setResponseStatusTime(timestampService.createTimestamp());
    HttpStatus status = HttpStatus.BAD_REQUEST;

    ResponseEntity<ResponseStatus> response = new ResponseEntity<ResponseStatus>(responseStatus, status);

    return response;
}

在本例中,您可以看到有一个ResponseStatus对象。此对象包含状态代码、状态消息、日期和时间的字段。您可能不需要日期和时间,但我发现当某人发送给我一个他们看到的错误时,它很有用,因为这样就很容易跟踪它在我们的服务器日志中发生的确切位置。

湛宝
2023-03-14

定义一个新的异常类,例如ResourceNotFoundException,并从带注释的控制器方法GetName抛出该类的实例。

然后还要在Controller类中定义一个带注释的异常处理程序方法来处理该异常,并返回一个404 Not Found状态代码,可能会对其进行日志记录。

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public void handleResourceNotFoundException(ResourceNotFoundException ex)
{
    LOG.warn("user requested a resource which didn't exist", ex);
}

甚至返回一些错误消息,使用@ResponseBody注释:

@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ResponseBody
public String handleResourceNotFoundException(ResourceNotFoundException ex)
{
    return ex.getMessage();
}
 类似资料:
  • 我在CentOs上的上设置了一个新的Gitlab,并在continuous-delivery组下创建了一个新的存储库。完整路径为。此路径下只有一个文件,即readme.txt。 我试图实现的是当有人将更改推送到服务器时创建一个新文件。下面是我在服务器上做的事情: 在echo“text”>>file_name`创建一个新文件 chmod它们为775。 当我将更改从本地推送到服务器时,不会创建任何文件

  • 问题内容: 如何将servlets API添加到项目的pom.xml中 mvnrepository.com有很多servlet api和名称类似的项目,我不知道哪个是正确的。还是所有人都还好吗? 问题答案: 我相信大多数Web /应用程序服务器都捆绑了servlet api版本,因此您不希望将api捆绑到.war文件中。您需要找出服务器随附的版本,然后才能使用 用您的版本替换servlet-api

  • 我想在我的应用程序中添加带有,但一旦我将插件添加到我的应用程序中。yaml,我的应用程序不再运行。下面是错误 失败:生成失败,出现异常。 > 错误:任务执行失败:app:transformDexArchiveWithExternalLibsDexMergerForDebug'。 通用域名格式。Android建设者德兴。DexArchiveMergerException:合并dex存档时出错:/Us

  • 我想将集成测试添加到我的Gradle构建(版本1.0)中。它们应该与我的正常测试分开运行,因为它们需要将webapp部署到localhost(它们测试那个webapp)。测试应该能够使用在我的主源集中定义的类。我该怎么做?

  • 问题内容: 我不太确定是否由于尝试执行以下MySQL程序而关闭了与此类似的问题。 在bash命令行上并得到此错误 我该如何解决此问题? 我实际上是从Python程序运行此命令,但将其拉出以尝试在bash命令行上摆弄它。 我已经看到了如何修改my.cnf(本地文件),但是如果可以避免的话,我不希望对全局进行更改。 这是MySQL版本。 问题答案: 如“ 安全问题”中所述: 为了解决这些问题,我们更改

  • 所以,最近我开始制作自己的机器人,我也不是最有经验的人,但我知道我在做什么。我打破了基本的不和。在Discord上提供了js索引。js指南,并且只是在其中添加了我自己的代码,而没有实际接触命令处理程序。 对于一些命令,我想有一个烫发水平,只有烫发水平 permlvl 1=管理消息^不是实际的代码只是一个例子,这样只有具有perm级别的用户才能使用它。 这是我的索引。目前: 除了我的另一个客户。和客