web-dev-qa-db-ja.com

メソッドには8つのパラメーターがあり、7つ以上が許可されています

ソナーリントでコードをスキャンすると、次のコードに「メソッドには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)

注:これは、パラメーターをスキップできないコントローラーメソッドです

参考:squid:S00107として簡単な修正を示すEclipse

誰もこのバグを解決する方法を知っていますか?

6
Baji Shaik

ここで考慮すべきことが2つあります。

  1. Sonarでこのルールを調整し、許可されたパラメーターの数を増やすことができます。デフォルト(?)の代わりに10を入れてください。

[〜#〜] 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) { ... }
6
Andremoniy

これは、ソナーで構成されたデフォルトルールに必要な拡張機能です。ソナールールによれば、@ RequestMappingアノテーションが付けられたメソッドは、上記の「メソッドには7つ以上のパラメーターを含めることはできません」というルールにバインドされていません。例外を呼び出すスクリーンショットを見つけてください。 例外を示すソナーのスクリーンショット

ソナーによると、「Springの@RequestMappingアノテーションが付けられたメソッドには多くのパラメーターがあり、カプセル化が可能です。したがって、そのようなメソッドは無視されます。」

しかし、ソナールールは、春に導入された@ POSTMapping、@ PutMappingなどをスキップするようにアップグレードされていません。理想的には、@ RequestMappingの子実装です。 @RequestMappingに適用されるルールもこれらに適用される必要があります。

これについて、SONARでチケットを調達する予定です。作成されたリンクを更新します。

今のところ、ソナーがデフォルトのルールセットのソリューション部分を提供するまで、ソナールールを編集するか、今のところ無視してください。

2
srinivasan Y

一般的に、これは良いルールです。パラメータオブジェクトまたはビルダーにリファクタリングする必要があります。ただし、ドメインモデルオブジェクト(@Entityなど)または値がコンストラクターを介してのみ渡される不変オブジェクトの作成に関係する場合、この規則を無視する傾向があります。

0
Coen Damen