Spring MVC @RestController @ResponseBody类中如何使用HTTP状态代码响应以返回对象?


问题内容

我想有一个@RestController,这需要@PathVariable以JSON格式返回一个特定的对象,适当的状态代码一起。到目前为止,代码是正确的,它将以JSON格式返回该对象,因为默认情况下它使用的是Jackson库中内置的Spring
4。

但是我不知道如何做到这一点,所以它将向用户显示一条消息,说我们需要一个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;
        }
    }
}

问题答案:

A
@RestController不适合这样做。如果您需要返回不同类型的响应,请使用ResponseEntity<?>,您可以在其中显式设置状态代码。

bodyResponseEntity处理方式与任何带@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);
    }
}

请注意,您无需在带注释的类中@ResponseBody使用@RequestMapping方法@RestController