Spring ResponseEntity最佳实践

时间:2018-04-09 11:50:29

标签: java json spring rest

我是RESTful Web服务的新手,我正在学习Web服务的Spring实现。

我对学习如何在大多数用例中正确使用ResponseEntity返回类型特别感兴趣。

我有一个端点:

/myapp/user/{id}

此端点支持GET请求,并将返回ID为{id}的User对象的JSON格式字符串。我计划将控制器方法注释为生成JSON。

如果存在ID为{id}的用户,我将状态设置为200,并在正文中设置用户的JSON字符串。

如果没有用户存在该ID,我将返回一些400错误的味道,但我不确定在ResponseEntity的主体中设置什么。由于我将端点方法注释为生成JSON,我是否应该提出表示错误的通用PO​​JO,并将其作为JSON返回?

2 个答案:

答案 0 :(得分:1)

您不需要使用通用Pojo,使用RequestMapping可以为每个Http代码创建不同的响应。在这个例子中,我将展示如何控制错误并相应地给出响应。

这是具有服务规范的RestController

@RestController
public class User {

    @RequestMapping(value="/myapp/user/{id}", method = RequestMethod.GET)
    public ResponseEntity<String> getId(@PathVariable int id){

        if(id>10)
            throw new UserNotFoundException("User not found");

        return ResponseEntity.ok("" + id);
    }

    @ExceptionHandler({UserNotFoundException.class})
    public ResponseEntity<ErrorResponse> notFound(UserNotFoundException ex){

        return new ResponseEntity<ErrorResponse>(
            new ErrorResponse(ex.getMessage(), 404, "The user was not found") , HttpStatus.NOT_FOUND);
    }
}

在getId方法中,如果customerId&lt; 10它应该响应客户ID作为正文消息的一部分,但是当客户大于10时应该抛出异常,在这种情况下服务应该响应ErrorResponse。

public class ErrorResponse {

    private String message;
    private int code;
    private String moreInfo;

    public ErrorResponse(String message, int code, String moreInfo) {
        super();
        this.message = message;
        this.code = code;
        this.moreInfo = moreInfo;
    }

    public String getMessage() {

        return message;
    }

    public int getCode() {

        return code;
    }

    public String getMoreInfo() {

        return moreInfo;
    }
}

最后我使用了一个特定的Exception来查找“Not Found”错误

public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException(String message) {
        super(message);
    }
}

答案 1 :(得分:0)

  

如果没有用户存在该ID,我将返回   一些400错误的味道,但我不知道在体内设置什么   ResponseEntity。因为我将端点方法注释为   生成JSON,我应该想出一个代表的通用PO​​JO   一个错误,并将其作为JSON返回?

这绝对是一种可行的解决方案,如果你想添加例如请求失败的一个更具体的原因,或者您想要添加特定的I18N消息,或者只是想要通知您的API以提供一些抽象结构。

我自己更喜欢@Herr Derb提出的解决方案,如果没有任何回报,请不要退货。返回的数据可能完全没有必要/未使用,如果返回代码不是2XX,接收者可能只是丢弃它。

这可能是相关的: http://www.bbenson.co/post/spring-validations-with-examples/ 作者描述了如何验证传入模型并构建一般错误响应。也许这是你想做的事情......