在spring boot中发送REST响应的最佳方式

时间:2018-01-11 20:40:56

标签: java spring rest controller response

在春季启动中发送休息响应的最佳方法是什么?另外我应该如何管理发送状态代码才能正确完成?

目前我使用ResponseEntity来做,但我怀疑这是最优雅的方式。

示例代码:

@PostMapping()
public ResponseEntity post(@Valid @RequestBody Item item, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        return new ResponseEntity<>(new ModelErrors(bindingResult), HttpStatus.BAD_REQUEST);
    }

    return new ResponseEntity<>(itemService.addItem(item), HttpStatus.CREATED);
}

ModelErrors类扩展了一个HashMap类,只是获取并包装了BindingResult的错误消息。

1 个答案:

答案 0 :(得分:6)

我个人认为返回ResponseEntity将成为很多案例的最佳选择。在我看来,更可读的方法是在ResponseEntity上使用方便的状态方法

@PostMapping()
public ResponseEntity post(@Valid @RequestBody Item item, BindingResult bindingResult){

    if (bindingResult.hasErrors()){
        return ResponseEntity.badRequest().body(new ModelErrors(bindingResult));
    }

    return ResponseEntity.created().body(itemService.addItem(item));
}

或者,您可以使用传递status的{​​{1}}方法或此类状态代码

HttpStatus

另一种选择是在不使用ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ModelErrors(bindingResult)); ResponseEntity.status(201).body(itemService.addItem(item)); 的情况下返回您喜欢的任何类型,但这样可以减少对响应的控制,并要求您具有正确的ResponseEntity配置(你可以阅读here)。

一个简单的例子可能看起来像这样

MessageConverter

如果一切都配置正确,您最终会得到像这样的回复

@RequestMapping("/hotdog")
public Hotdog hotdog() {
    return new Hotdog("mystery meat", "ketchup, mustard");
}