【问题标题】:How to respond with HTTP status code in a Spring MVC @RestController @ResponseBody class returning an object?如何在返回对象的 Spring MVC @RestController @ResponseBody 类中使​​用 HTTP 状态代码进行响应?
【发布时间】:2014-11-25 21:04:56
【问题描述】:

我正在尝试让 @RestController 接受 @PathVariable 返回 JSON 格式的特定对象以及正确的状态代码。到目前为止,代码的方式是返回 JSON 格式的对象,因为它默认使用 Spring 4 内置的 Jackson 库。

但是我不知道如何制作它,所以它会向用户发送一条消息,说我们想要一个 api 变量,然后是 JSON 数据,然后是错误代码(或成功代码,取决于一切是否顺利)。示例输出为:

请输入 api 值作为参数(注意,如果需要,也可以是 JSON)

{"id": 2, "api": "3000105000" ... }(注意这将是 JSON 响应对象)

状态码 400(或正确的状态码)


带参数的url是这样的

http://localhost:8080/gotech/api/v1/api/3000105000

我目前的代码:

@RestController
@RequestMapping(value = "/api/v1")
public class ClientFetchWellDataController {

    @Autowired
    private OngardWellService ongardWellService;

    @RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
    @ResponseBody
    public OngardWell fetchWellData(@PathVariable String apiValue){
        try{
            OngardWell ongardWell = new OngardWell();
            ongardWell = ongardWellService.fetchOneByApi(apiValue);
    
            return ongardWell;
        }catch(Exception ex){
            String errorMessage;
            errorMessage = ex + " <== error";
            return null;
        }
    }
}

【问题讨论】:

  • 轻微反对,但看起来代码说 url 应该以 /api/v1/wells/{apiValue} 结尾,而不是 /api/v1/api/{apiValue}

标签: java json spring spring-mvc


【解决方案1】:

@RestController 不适用于此。如果您需要返回不同类型的响应,请使用ResponseEntity&lt;?&gt;,您可以在其中明确设置状态代码。

ResponseEntity 中的body 的处理方式与任何@ResponseBody 注释方法的返回值相同。

@RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET)
public ResponseEntity<?> fetchWellData(@PathVariable String apiValue){
    try{
        OngardWell ongardWell = new OngardWell();
        ongardWell = ongardWellService.fetchOneByApi(apiValue);

        return new ResponseEntity<>(ongardWell, HttpStatus.OK);
    }catch(Exception ex){
        String errorMessage;
        errorMessage = ex + " <== error";
        return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
    }
}

请注意,@RestController 注释类中的 @RequestMapping 方法不需要 @ResponseBody

【讨论】:

    【解决方案2】:

    惯用的方法是使用异常处理程序,而不是在常规请求处理方法中捕获异常。异常的类型决定了响应代码。 (403 表示安全错误,500 表示意外平台异常,随你喜欢)

    @ExceptionHandler(MyApplicationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public String handleAppException(MyApplicationException ex) {
      return ex.getMessage();
    }
    
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public String handleAppException(Exception ex) {
      return ex.getMessage();
    }
    

    【讨论】:

    • mmmmm 有点意思,那么我现有的代码将放在哪里?还是您发布的代码是我将调用来处理我的异常的自己的东西?抱歉,我以前从未见过这样的代码,虽然看起来非常有用,但感谢您的帮助
    • 它与您的代码在同一个控制器中。只需从处理程序方法中取出 try-catch。
    • 我认为这是编写 RestAPI 的非常有用和更好的方法。如果我有多个控制器,我是否必须为所有控制器编写这些处理程序,或者我可以将它们放在基类或接口中并使用它?
    猜你喜欢
    • 2014-09-06
    • 2014-10-14
    • 2013-04-20
    • 1970-01-01
    • 2016-07-19
    • 2011-11-20
    • 2021-11-12
    • 2013-01-20
    • 2016-05-28
    相关资源
    最近更新 更多