方法有8个参数,大于7个授权

时间:2018-03-28 12:52:27

标签: java sonarqube sonarlint sonarlint-eclipse

当我使用声纳lint扫描代码时,以下代码显示错误为“方法有8个参数,大于7个授权”

@PutMapping("/something")
public List<SomeList> updateSomeThing(@PathVariable final SomeCode code,
                                            @PathVariable final SomeId id, 
                                            @PathVariable final String testId,
                                            @PathVariable final String itemId,
                                            @RequestBody final List<Test> someList,
                                            @RequestHeader("test") final String testHeader,
                                            final HttpServletRequest request,
                                            final SomeHeaders someHeaders)

注意:这是一种控制器方法,我们不能跳过任何参数

仅供参考:Eclipse显示快速修复为squid:S00107

任何人都知道如何解决这个错误?

3 个答案:

答案 0 :(得分:4)

这里有两件事要考虑。

  1. 您可以在Sonar中调整此规则并增加授权参数的数量。比如把它放在10而不是默认(?)7。
  2. UPD :以下建议基于旧版问题。它可能不再适用于新的问题背景。

    1. 但通常你应该重新考虑你的方法界面。拥有许多参数意味着您的架构中存在某些错误,documentation可能会被破坏。
    2. 在您的特定示例中,我希望您可以拥有一个聚合类Order

      public class Order {
         private CountryCode countryCode;
         private String orderId;
         private User user;
         private String orderId;
         private String item;
         private List<Person> persons;
         private ShippingAddress address;
         private PaymentMethod payment;
         private Product product;
         // ...
      }
      

      管理而不是处理许多参数是合乎逻辑的。然后您的问题将自动解决:

      @GetMapping
      public void updateSomething(Order order) { ... }
      

答案 1 :(得分:2)

这是对声纳中配置的默认规则的增强。根据声纳规则,用@RequestMapping注释的方法不受上述“方法不应具有7个以上的参数”规则的约束。请找到调用该异常的屏幕截图。Sonar screenshot stating the exception

根据声纳, “用Spring的@RequestMapping注释的方法可能有很多参数,可以封装。因此这些方法将被忽略。”

但是当春天引入声纳规则时,它们并未升级为跳过@ POSTMapping,@ PutMapping等。理想情况下,它们是@RequestMapping的子实现。适用于@RequestMapping的规则也应适用于这些规则。

我打算为此与SONAR筹集票。创建后将更新链接。

目前,您可以编辑声纳规则或暂时忽略这些规则,直到声纳提供其默认规则集的解决方案部分为止。

答案 2 :(得分:0)

通常,这是一个好规则。您应该重构为参数对象或生成器。但是,当涉及到仅通过构造函数传递值的域模型对象(如@Entity)或不可变对象的创建时,我倾向于忽略该规则。