java - SonarLint:返回空集合而不是 null

标签 java spring-boot sonarlint

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

相关文章:

java - 在 Java 中创建 HTTPS Web 服务

java - Spring 启动配置。集合 Autowiring - 成功 Autowiring 后获得意想不到的值(value)

java - 使用 prometheus 的自定义计数器在/actuator/prometheus 上不可见

java - SonarLint 2.2.1 Eclipse 没有发现大部分问题(与在线示例不同)

java - Hibernate - 将关系及其管理委托(delegate)给子类以保持整洁

java - 追加两个 XmlObject

java - 使用 Spring Data JPA,如何在同一字段上创建具有多个条件或运算的查询?

java - Spring Boot - ErrorPageFilter 找不到 RequestDispatcher

eclipse - 如何安装较旧的 SonarLint Eclipse 插件

java - Sonar Eclipse 插件未检测到重复 block