【问题标题】:SonarQube complains about using ResponseEntity with a wildcardSonarQube 抱怨将 ResponseEntity 与通配符一起使用
【发布时间】:2017-12-11 23:09:26
【问题描述】:

我使用 SpringBoot 进行 REST Web 服务开发,使用 SonarQube 进行静态分析。

我的应用程序中有几个端点如下所示:

@PostMapping
ResponseEntity<?> addSomething(@RequestBody Some object) {
    // some code there
    return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

SonarQube 抱怨将 ResponseEntity 与通配符一起使用,向我报告了一个严重问题“不应在返回参数中使用通用通配符类型”

我想知道是否应该在 SonarQube 中禁用此验证,或者为这些情况的返回类型提出不同的方法。

你怎么看?

【问题讨论】:

  • 恕我直言,在这种情况下,我会使用 Serializable 接口,因为我通常想返回一个可以序列化的对象

标签: spring-mvc spring-boot sonarqube


【解决方案1】:
@PostMapping
ResponseEntity<Object> addSomething(@RequestBody Some object) {
    // some code there
    return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

这也将消除错误。它仍然非常通用,但是如果您想根据结果返回不同的类型,它是一种解决方案。例如:

@PostMapping
    ResponseEntity<Object> addSomething(@RequestBody Some object) {

        //Will return ResponseEntity<> with errors
        ResponseEntity<Object> errors = mapValidationService(bindingResult);
        if (!ObjectUtils.isEmpty(errors)) return errors;
        
        // some code there
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

【讨论】:

    【解决方案2】:

    所以实际上我发现规则非常自我描述:

    使用通配符作为返回类型隐含地意味着返回值应该被认为是只读的,但没有任何方式来强制执行这个约定。

    让我们以方法返回“列表”为例。是否可以在此列表中添加一只狗、一只猫……我们根本不知道。方法的使用者不必处理此类破坏性问题。

    https://sonarcloud.io/organizations/default/rules#rule_key=squid%3AS1452

    所以实际上在你的情况下,你不想要任何类型的 Class,你特别想要一个 Serializable-object - 原因很明显:它应该稍后序列化

    因此,与其使用?,不如使用Serializable。这始终取决于大小写,但通常您肯定希望某种通用接口或基类作为返回值。因此,后续开发人员肯定知道他可以期待什么,以及他肯定可以使用什么样的功能。

    【讨论】:

    • 更新了一个问题。我使用 ResponseEntity> 返回类型来根据控制器中实现的逻辑返回特定的状态代码。在这种情况下,RepsonseEntity 将 T 参数替换为本身不可序列化的“对象”。所以Serializable在这种情况下并不是一个很好的选择。
    • 事实上 HttpStatus 实现了可序列化:docs.spring.io/spring/docs/current/javadoc-api/org/…
    【解决方案3】:

    最后我从返回值中删除了&lt;?&gt;,所以现在的代码如下所示:

    @PostMapping
    ResponseEntity addSomething(@RequestBody Some object) {
        // some code there
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }
    

    SonarQube 不再抱怨,现在代码看起来更简单了。

    【讨论】:

    • 在这种情况下,消息更改为:“为此泛型提供参数化类型。”
    猜你喜欢
    • 2022-07-06
    • 2019-04-11
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2018-05-15
    相关资源
    最近更新 更多