我正在对返回对象列表的方法进行ajax调用,如果在try-catch块中获取数据时发生了某些事情,我会得到一个response.setStatus(400)
,然后在前端显示错误,那里我返回null,那里是我收到SonarLint通知的地方。现在,如果我将其更改为空集合,则会出现以下错误:
getWriter() has already been called for this response
我认为以上是因为我返回的是空集合,并且http响应状态为400。如果我将其保留为null,那么一切正常,只是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;
}
关于如何解决此通知的任何想法?
您可以尝试
return null; //NOSONAR
您的班级至少混合了三个不同的问题。它查询数据库,处理结果并充当获取端点。如果将这些关注点分离为不同的类,并在它们之间使用清晰的api,则可以通过返回空列表来消除警告。
但是由于您对响应的创建没有很好的定义,因为在一种情况下,您是使用writer直接写给它的,而在其他情况下,您的框架会通过返回一个写入响应的List来处理该写操作(因此导致您看到的错误),您可能需要解决此问题。
我建议不要在此方法中捕获异常,而是将其抛出,并在控制器中使用exception handler method来处理它:
例如,如下所示:
@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleException(Exception e) {
log.error("Exception during request", e);
}
然后您也可以从常规方法中删除HttpServletResponse response
参数。