从数据库Spring Boot获取详细信息,异常错误

时间:2018-07-16 11:21:18

标签: java spring-mvc spring-boot

我正在尝试使用Spring Boot从基于多个ID的数据库中的多个数据中获取数据。 基本上,这是一个GET调用,它将请求参数作为ID列表,并相应地返回响应。 ID在数据库中是唯一的

 Url : api/details/1a,2a,3b

我得到的答复是:

Get(value = "api/details/{Ids})
{
[id="1a",name="Raj", interest="Football"],
[id="2a",name="Tom", interest="Cricket"]
[id="3b",name="Kane", interest="Baseball"]

}  

很好。但是当我输入错误的ID时,我得到的响应为:

Url : api/details/xyz,abc,3b
{
null,
null,
[id="3b",name="Kane", interest="Baseball"]

}  

我希望显示的是ID与状态代码一起不存在,而不是null。像

{
2-Not found,3-Not Found, 
id="3b",name="Kane", hobby="Baseball, 
}

我的控制器类是:

@RequestMapping(value = "api/details{Ids}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<Game>> 
getMultipleDetails(@PathVariable("Idss") String Idss) {
    HttpHeaders headers = new HttpHeaders();
    List<String> ids = Arrays.asList(Idss.split(","));
    List<Game> list = new ArrayList<>();
    Game details= null;
    for (String id : ids) {

        details= da.getMultipleDetails(id);
        list.add(devices);
    }
    if (details== null) {
        throw new RuntimeException(HttpStatus.NOT_FOUND.toString());
    }
    return new ResponseEntity<List<Game>>(list, headers, HttpStatus.OK);

}

}

我的存储库类如下:

public Device getMultipleDetails(String id) {
    Game details= null;
    try {
        details= jdbcTemplate.queryForObject("SELECT * FROM table_name WHERE Id = ?",new DeviceRowMapper(), id);

    } catch (Exception e) {
        // Log the system generated Id
        String systemRefId = String.valueOf(System.currentTimeMillis());
        LOGGER.error(systemRefId, e);
        //throw new DatabaseException(systemRefId, e);
    }
    return details;

}

游戏是我的模型类,其中包含ID,名称,爱好

2 个答案:

答案 0 :(得分:0)

您应该管理空对象,并管理消息,代码应该像这样,因为如果没有,则仅评估最后一个细节,这就是为什么不引发异常的原因

for (String id : ids) {

    details= da.getMultipleDetails(id);
    list.add(devices);
    if (details== null) {
        throw new RuntimeException(HttpStatus.NOT_FOUND.toString());
    }
}

答案 1 :(得分:0)

在设置ResponseEntity<List<Game>>时,您应该只返回其中包含List个对象的Game

不确定为什么要在同一列表中返回失败的列表,但是作为一种变通办法,我将设置id中未找到的列表,并在nameGame字段中将设置“未找到”,而不是返回空对象。例如:

public Device getMultipleDetails(String id) {
    Game details = new Game();
    try {
        details= jdbcTemplate.queryForObject("SELECT * FROM table_name WHERE Id = ?",new DeviceRowMapper(), id);
    //If details is not null but it's empty
    if (StringUtils.IsEmpty(details.getId())) {
      details.setId(id);
      details.setName("Not Found");
      details.setGame("Not Found");
    }

    } catch (Exception e) {
        // Log the system generated Id
        String systemRefId = String.valueOf(System.currentTimeMillis());
        LOGGER.error(systemRefId, e);
        //If details is null it will trow null pointer exception
        details = new Game();
        details.setId(id);
        details.setName("Not Found");
        details.setGame("Not Found");
    }

    return details;

}

我强烈建议您在Game类中重命名Field游戏。 字段不得重复其包含类的名称。

让一个类成员与其所在的类具有相同的名称(不区分大小写)会令人困惑。在考虑为类本身命名类实例的常见做法时,尤其如此。

最佳做法是,将与封闭类同名的任何字段或成员都重命名,以更好地描述其表示或持有的类的特定方面。

例如,我建议将其重命名为typeOfGame之类。