Java 方法有8个参数,大于7个

Java 方法有8个参数,大于7个,java,sonarqube,sonarlint,sonarlint-eclipse,Java,Sonarqube,Sonarlint,Sonarlint Eclipse,当我用sonar lint扫描代码时,下面的代码显示错误为“方法有8个参数,大于7个” @PutMapping(“/something”) 公共列表更新方法(@PathVariable final SomeCode, @路径变量final SomeId id, @PathVariable最终字符串testId, @PathVariable最终字符串itemId, @请求体最终列表someList, @RequestHeader(“test”)最终字符串testHeader, 最终HttpServ

当我用sonar lint扫描代码时,下面的代码显示错误为“方法有8个参数,大于7个”

@PutMapping(“/something”)
公共列表更新方法(@PathVariable final SomeCode,
@路径变量final SomeId id,
@PathVariable最终字符串testId,
@PathVariable最终字符串itemId,
@请求体最终列表someList,
@RequestHeader(“test”)最终字符串testHeader,
最终HttpServletRequest请求,
最终部分标题(部分标题)
注意:这是一种控制器方法,我们不能跳过任何参数

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


有人知道如何解决这个错误吗
  • 您可以在Sonar中调整此规则并增加授权参数的数量。说把它放在10而不是默认值(?)7
  • 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;
       // ...
    }
    

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

    声纳说,, 用Spring的@RequestMapping注释的方法可能有很多参数,可以进行封装。因此,这些方法被忽略

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

    我打算用声纳来开罚单。一旦创建,将更新链接


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

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

    首先,这是“违反规则”而不是错误。如果你需要它们,就把它们都留下。如果您希望在更少的参数中包含相同的信息:创建一个新的复合对象,其中至少包含两个参数。这不是Java bug,必须是内部代码“authorization”。该方法上有注释吗?如果是,请添加它们。@daniu这不是一个我也知道的java错误。这是一个声纳违规行为,正如我在声纳上已经提到的,你可以解决这种违规行为,因为“不会被修复”Mark Seemann有一篇很好的文章详细讨论了这一点:
    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) { ... }