2014-10-01 302 views
23

我想有一个@RestController这需要一个@PathVariable返回一个特定的对象JSON格式,在适当的状态代码一起。到目前为止,代码的方式,它将返回JSON格式的对象,因为它默认使用内置于Jackson库中的Spring 4。如何在Spring MVC @RestController中响应HTTP状态码@ResponseBody类返回一个对象?

但是我不知道如何使它所以它会给我们说希望有一个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; 
     } 
    } 
} 

回答

47

一个@RestController不适合这个。如果您需要返回不同类型的响应,请使用ResponseEntity<?>,您可以在其中明确设置状态码。

ResponseEntitybody将以与任何@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@RestController注解类中的一个@RequestMapping方法。

26

的惯用方法是使用异常处理程序,而不是在你的正常请求处理方法捕捉异常的。异常的类型决定了响应代码。 (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(); 
} 
+0

mmmmm还挺有意义的,那么我现有的代码在哪里呢?或者是你发布了自己的代码,我会打电话来处理我的异常?对不起,我从来没有见过这样的代码,看起来非常有用,尽管如此感谢您的帮助 – Cris 2014-10-01 05:13:37

+1

它与您的代码位于同一控制器中。只需将try-catch从处理程序方法中取出即可。 – Affe 2014-10-01 05:29:55

+0

这是写作RestAPIs我认为非常有用和更好的方式。 如果我有多个控制器,是否必须为所有控制器编写这些处理程序,或者我可以将这些处理程序放入基类还是接口中并使用它? – shraddha 2017-11-07 00:50:54

相关问题