0

我有一个返回 JSON 对象的 Spring 3 控制器。我正在使用 @ResponseBody 注释和 jackson-mapper-asl jar,Spring 将使用它们自动处理 JSON 转换。3 个返回语句返回不同的 JSON 格式。这可以通过使用 Object 修改 getPersonDetails 方法的返回类型来处理,还是有更好的方法。

@RequestMapping(value="/test", method=RequestMethod.GET)
public @ResponseBody List<Person> getPersonDetails() {


    List<Person> listPerson = null;
    try {
        // Call to service and get the list of Person
        listPerson = getPersonList();
        if(CollectionUtils.isNotEmpty(listPerson)) {
            // Return JSON object
            //{"Name":"XYZ", "Age":25}
        } else {
            // Return JSON object
            //{"InformationMessage":"No data found."}
        }
    } catch(final Exception e) {
        // Return JSON object
        // {"ExceptionMessage":"Exception in controller."}
    }
}
4

5 回答 5

1

我会用ResponseEntity<?>

@RequestMapping(value="/test", method=RequestMethod.GET)
public @ResponseBody ResponseEntity<List<Person>> getPersonDetails() {


    List<Person> listPerson = null;
    try {
        // Call to service and get the list of Person
        listPerson = getPersonList();
        if(CollectionUtils.isNotEmpty(listPerson)) {
            return new ResponseEntity<>(listPerson, HttpStatus.OK);
        } else {
            return new ResponseEntity(HttpStatus.NOT_FOUND);
        }
    } catch(final Exception e) {
         return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}
于 2016-02-27T17:26:28.783 回答
1

你可以这样

@RequestMapping(value="/test", method=RequestMethod.GET)
public @ResponseBody ResponseEntity<List<Person>> getPersonDetails() {
try{
if(dataAvailable) // if success 
{ 

return new ResponseEntity<List<Person>>(yourlist, responseHeaders, HttpStatus.OK);
}
else{
return new ResponseEntity<List<Person>>(HttpStatus.NOT_FOUND);
}

}catch(Exception e){
// your custom exception here
throw new PersonNotFoundException();
}

}

注意:这里不是在IDE中输入的,任何语法错误请随时编辑。

于 2016-02-27T17:25:30.817 回答
0

从控制器方法中抛出特定异常。例如,在您的情况下,如果 list 为空,则自定义 PersonNotFoundException,如果出现未知错误,则使用 ServiceException。并通过返回类型为 ResponseEntity 的 @ExceptionHandlers 处理这些异常。

控制器方法的返回类型应仅为 List。

这也将帮助您获得整洁的文档。

尝试在 spring 中搜索如何使用 ExceptionHandlers。

希望这能回答你的问题。

于 2016-02-27T19:19:07.627 回答
0

您可以创建 JResponse 类并将数据保存到。

public class JSonResponse{
  private Object result;
  private String statu;

  // 
}


 @RequestMapping(value="/test", method=RequestMethod.GET)
 public @ResponseBody JSonResponse getPersonDetails() {
  JSonResponseres = new JSonResponse();
  List<Person> listPerson  = null;
  try {
    // Call to service and get the list of Person
    listPerson = getPersonList();
    if(CollectionUtils.isNotEmpty(listPerson)) {
        res.setResult(listPerson);
        res.status("SUCCESS");
     } else {
        res.setResult("Not Found Data");
        res.status("FAIL");
     }
  } catch(final Exception e) {
    // Return JSON object
    // {"ExceptionMessage":"Exception in controller."}
 }

  return res;
}
于 2016-02-28T04:49:59.090 回答
0

此外:没有必要通过“消息对象”来表明有问题。这就是 HTTP-Status-Codes 的用途。

我会去注入一个HttpServletResponse并使用setStatus()来指示错误,指示 a404或 a 500。此外,您可以向正文发送一条消息getWriter().write("{\"ExceptionMessage\":\"Exception in controller.\"}")

@RequestMapping(value="/test", method=RequestMethod.GET)
public @ResponseBody List<Person> getPersonDetails(HttpServletResponse response) {
    List<Person> listPerson = null;
    try {
        listPerson = getPersonList();
        if(!CollectionUtils.isEmpty(listPerson)) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            response.getWriter().write("Whatever you want");
        }
    } catch(final Exception e) {
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        response.getWriter().write("Whatever you want");
    }
    return listPerson;
}
于 2016-02-27T18:19:05.573 回答