【问题标题】:How to return error message from rest service如何从休息服务返回错误消息
【发布时间】:2019-04-24 21:25:03
【问题描述】:

我已经使用 Spring Boot 定义了一个返回接口的休息服务。当服务发生错误时,如何返回有意义的错误消息?结果,在浏览器上,我显示了 MyInterface 类型的 Json。

下面的代码是控制器调用的服务:

public MyInterface getSomeTask() {

    // business logic here
    MyInterface myObject= getRelatedClass();

    if(myObject == null){
       // how to return error message 
    }

    return myObject;
 }

【问题讨论】:

    标签: spring rest spring-mvc spring-rest


    【解决方案1】:

    其中一种可能性是抛出异常,然后用 Spring 处理它,以便它返回正确的 json。

    您可能想查看this 有关错误处理的文章。

    您可以创建将在您的逻辑中抛出的自定义异常,然后对其进行处理:

    if(myObject == null){
       throw new CouldNotGetRelatedClassException(); 
    }
    

    在控制器中,您可以使用错误处理方法,例如:

    public class FooController {
    
       @ExceptionHandler({ CouldNotGetRelatedClassException.class})
       public void handleException() {
           // logic of exception handling
       }
    
    }
    

    另一种方法可能是创建带有 @ControllerAdvice 注释的类,该注释将在抛出的异常上创建自定义 json 响应:

    @ControllerAdvice
    public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    
       @ExceptionHandler(value = {CouldNotGetRelatedClassException.class})
       protected ResponseEntity<Object> handleNotFound(
         RuntimeException ex, WebRequest request) {
           String bodyOfResponse = "This should be application specific";
           return handleExceptionInternal(ex, bodyOfResponse, 
             new HttpHeaders(), HttpStatus.NOT_FOUND, request);
       }
    }
    

    但是您可能想知道错误响应可能与您的正常对象具有不同的结构,因此您可能希望使用不同的 HTTP 状态代码返回它,以便前端可以确定此消息将以不同方式反序列化。

    【讨论】:

    • 感谢您的回答。但是 hadleException 方法不返回任何东西,那么浏览器将如何在屏幕上显示任何 json 呢?将返回类型更改为 MyInterface 并为 MyInterface 创建新实现以在出现异常时返回可能是一种选择。这是应该的方式还是不好的做法?
    • @user1474111 我添加了更多示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多