当我使用声纳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
任何人都知道如何解决这个错误?
答案 0 :(得分:4)
这里有两件事要考虑。
UPD :以下建议基于旧版问题。它可能不再适用于新的问题背景。
在您的特定示例中,我希望您可以拥有一个聚合类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)或不可变对象的创建时,我倾向于忽略该规则。