ソナーリントでコードをスキャンすると、次のコードに「メソッドには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
誰もこのバグを解決する方法を知っていますか?
ここで考慮すべきことが2つあります。
[〜#〜] 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) { ... }
これは、ソナーで構成されたデフォルトルールに必要な拡張機能です。ソナールールによれば、@ RequestMappingアノテーションが付けられたメソッドは、上記の「メソッドには7つ以上のパラメーターを含めることはできません」というルールにバインドされていません。例外を呼び出すスクリーンショットを見つけてください。 例外を示すソナーのスクリーンショット
ソナーによると、「Springの@RequestMappingアノテーションが付けられたメソッドには多くのパラメーターがあり、カプセル化が可能です。したがって、そのようなメソッドは無視されます。」
しかし、ソナールールは、春に導入された@ POSTMapping、@ PutMappingなどをスキップするようにアップグレードされていません。理想的には、@ RequestMappingの子実装です。 @RequestMappingに適用されるルールもこれらに適用される必要があります。
これについて、SONARでチケットを調達する予定です。作成されたリンクを更新します。
今のところ、ソナーがデフォルトのルールセットのソリューション部分を提供するまで、ソナールールを編集するか、今のところ無視してください。
一般的に、これは良いルールです。パラメータオブジェクトまたはビルダーにリファクタリングする必要があります。ただし、ドメインモデルオブジェクト(@Entityなど)または値がコンストラクターを介してのみ渡される不変オブジェクトの作成に関係する場合、この規則を無視する傾向があります。