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

当我使用声纳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)

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

仅供参考:日食显示快速修复为鱿鱼:S00107

有人知道如何解决这个错误吗?


答案 1

这里有两件事需要考虑。

  1. 您可以在Sonar中调整此规则并增加授权参数的数量。假设将其设置为10而不是默认值(?7.

UPD:以下建议基于旧问题版本。它可能不再适用于新的问题上下文。

  1. 但通常您应该重新考虑方法接口。有许多参数意味着您的体系结构中可能存在问题,并且单一责任原则可能会被打破。

假设在你的特定示例中,我希望你可以有一个聚合类: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) { ... }

答案 2

这是对声纳中配置的默认规则所需的增强。根据声纳规则,用@RequestMapping注释的方法不受上述“方法不应超过7个参数”规则的约束。请找到调用异常的屏幕截图。声纳屏幕截图说明异常

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

但是声纳规则没有升级以跳过@POSTMapping,@PutMapping等。当春天介绍它们时。理想情况下,它们是@RequestMapping的子实现。适用于@RequestMapping的规则也应适用于这些。

我打算就此向SONAR提出一张票。将在创建链接后更新链接。

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


推荐