我正在对返回对象列表的方法进行 ajax 调用,如果在 try-catch block 中获取数据时发生某些情况,我有一个 response.setStatus(400)
来然后在前端显示错误,在那里我返回 null,在那里我收到 SonarLint 通知。现在,如果我将其更改为空集合,则会出现以下错误:
已为此响应调用 getWriter()
我认为上面的情况是因为我返回了空集合和 http 响应状态 400。如果我将其保留为空,那么一切正常,只是 SonarLint 通知。
@GetMapping("/runquery")
@ResponseBody
public List<Map<String, Object>> runQuery(@RequestParam(name = "queryId") String queryId, @RequestParam(name = "formData") String formData, HttpServletResponse response) throws IOException {
(...)
try {
queryResult = namedParameterJdbcTemplateHive.queryForList(query, paramSource);
for (Map<String, Object> map : queryResult) {
Map<String, Object> newMap = new HashMap<>();
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (key.contains(".")) {
key = key.replace(".", "_");
newMap.put(key, value);
} else {
newMap.put(key, value);
}
}
queryResultFinal.add(newMap);
}
} catch (Exception e) {
response.setStatus(400);
response.getWriter().write(e.getMessage());
return null; <-- SonarLint notification
}
return queryResultFinal;
}
知道如何修复此通知吗?
最佳答案
我建议不要捕获此方法中的异常,而是抛出它,并使用 exception handler method在你的 Controller 中来处理它。在这种情况下,您永远不会从该方法返回 null,Sonar 也没有什么可提示的。这也意味着您正在按照 Spring 设计的方式使用 Spring。
例如,如下所示:
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleException(Exception e) {
log.error("Exception during request", e);
}
或当前处理的直接等效项:
@ExceptionHandler
public ResponseEntity<?> handleException(Exception e) {
return ResponseEntity.badRequest().body(e.getMessage()).build();
}
切换到异常处理程序后,您可以从常规方法中删除 HttpServletResponse 响应
参数。
关于java - SonarLint:返回空集合而不是 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59970441/