14

当我使用声纳皮棉扫描代码时,以下代码将错误显示为“方法有 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

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

4

3 回答 3

14

这里有两件事需要考虑。

  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) { ... }
于 2018-03-28T13:03:01.810 回答
3

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

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

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

我计划就此向 SONAR 提出罚单。创建后将更新链接。

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

于 2018-09-24T22:18:51.467 回答
2

一般来说,这是一个很好的规则。您应该重构为 Parameter Object 或 Builder。但是,当它涉及创建域模型对象(如@Entity)或不可变对象时,我倾向于忽略此规则,其中值仅通过构造函数传入。

于 2019-10-24T12:18:23.627 回答