我正在尝试使用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,名称,爱好
答案 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
中未找到的列表,并在name
和Game
字段中将设置“未找到”,而不是返回空对象。例如:
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
之类。