Метод имеет 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)

Примечание. Это метод контроллера, мы не можем пропустить какие-либо параметры.

К вашему сведению: Eclipse показывает быстрое исправление как squid:S00107

Кто-нибудь знает, как решить эту ошибку?


person Baji Shaik    schedule 28.03.2018    source источник
comment
во-первых, это скорее нарушение правила, чем баг. если они вам нужны все, держите их все. Если вы хотите иметь ту же информацию с меньшим количеством параметров: создайте новый составной объект, содержащий как минимум два из этих параметров.   -  person Stultuske    schedule 28.03.2018
comment
Это не ошибка Java, это должна быть внутренняя авторизация кода.   -  person daniu    schedule 28.03.2018
comment
Есть ли аннотации к методу? Если это так, добавьте их edit.   -  person G. Ann - SonarSource Team    schedule 28.03.2018
comment
@daniu это не ошибка Java, я тоже знаю. это нарушение сонара, как я уже упоминал   -  person Baji Shaik    schedule 28.03.2018
comment
На сонаре вы можете решить этот вид нарушения, так как он не будет исправлен.   -  person jhamon    schedule 28.03.2018
comment
@BhajiShaik, что еще вам нужно, чтобы избавиться от этого предупреждения?   -  person Stultuske    schedule 28.03.2018
comment
@Stultuske Обновлен фрагмент кода, так как я не могу изменить номер параметра, нужно какое-то другое исправление. Поскольку я не являюсь администратором гидролокатора, я не могу изменить это ограничение с 7 на 10. Пожалуйста, предложите   -  person Baji Shaik    schedule 28.03.2018
comment
почему нельзя изменить количество параметров?   -  person Stultuske    schedule 28.03.2018
comment
@Stultuske это API, разработанный Клиентом. если вы считаете, что его можно изменить на 7 параметров, пожалуйста, сообщите, как мы можем сделать его 7.   -  person Baji Shaik    schedule 28.03.2018
comment
если вы не можете изменить это, не пытайтесь. то, что есть предупреждение сонара, не означает, что код не будет работать   -  person Stultuske    schedule 28.03.2018


Ответы (3)


Здесь нужно учитывать две вещи.

  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) { ... }
person Andremoniy    schedule 28.03.2018
comment
У Марка Симанна есть хорошая статья, в которой это обсуждается более подробно: blog.ploeh.dk/2010/ 02/02/Рефакторинг для AggregateServices - person openshac; 07.03.2019

Это усовершенствование, необходимое для правил по умолчанию, настроенных в сонаре. Согласно правилам сонара, метод, аннотированный @RequestMapping, не привязан к вышеуказанным правилам «Методы не должны иметь более 7 параметров». Найдите снимок экрана, вызывающий исключение. Снимок экрана сонара с указанием исключения

Согласно сонару, «методы, аннотированные с помощью Spring @RequestMapping, могут иметь множество параметров, при этом возможна инкапсуляция. Поэтому такие методы игнорируются».

Но правила сонара не были обновлены, чтобы пропустить @POSTMapping, @PutMapping и т. д., когда они были представлены весной. В идеале это дочерние реализации @RequestMapping. К ним также должны применяться правила, применимые к @RequestMapping.

Планирую поднять тикет с SONAR по этому поводу. Ссылка будет обновлена ​​после создания.

На данный момент вы можете редактировать свои правила сонара или пока игнорировать их, пока сонар не предоставит решение, являющееся частью их набора правил по умолчанию.

person srinivasan Y    schedule 24.09.2018

В целом это хорошее правило. Вы должны выполнить рефакторинг объекта Parameter или Builder. Однако я склонен игнорировать это правило, когда речь идет о создании объекта модели предметной области (например, @Entity) или неизменяемого объекта, значения которого передаются только через конструктор.

person Coen Damen    schedule 24.10.2019