SonarLint:返回一个空集合,而不是null

问题描述 投票:0回答:3

我正在对返回对象列表的方法进行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;        
}

关于如何解决此通知的任何想法?

java spring-boot sonarlint
3个回答
0
投票

您可以尝试

return null;    //NOSONAR

0
投票

您的班级至少混合了三个不同的问题。它查询数据库,处理结果并充当获取端点。如果将这些关注点分离为不同的类,并在它们之间使用清晰的api,则可以通过返回空列表来消除警告。

但是由于您对响应的创建没有很好的定义,因为在一种情况下,您是使用writer直接写给它的,而在其他情况下,您的框架会通过返回一个写入响应的List来处理该写操作(因此导致您看到的错误),您可能需要解决此问题。


0
投票

我建议不要在此方法中捕获异常,而是将其抛出,并在控制器中使用exception handler method来处理它:

例如,如下所示:

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public void handleException(Exception e) {
    log.error("Exception during request", e);
}

然后您也可以从常规方法中删除HttpServletResponse response参数。

© www.soinside.com 2019 - 2024. All rights reserved.