Позвони в сервис Spring и отправь параметры через конструктор - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть этот простой Spring Service:

@Service
public class BinCountryCheckFilterImpl {

    @Autowired
    private RiskFilterService riskFilterService;

    private Terminals terminal;    

    @Autowired
    public BinCountryCheckFilterImpl(Terminals terminal) {  
        this.terminal = terminal;
    }
}

Terminals - объект, уникальный для каждого полученного запроса. Кроме того, binCountryCheckFilter должен быть уникальным для каждого запроса - он должен проверять данные для какого-либо бизнес-условия.

Я хочу позвонить в службу отсюда:

@Service
public class FilterProcessing {

    @Autowired
    private BinCountryCheckFilterImpl binCountryCheckFilter; 

    public Response someMetohd(Terminals terminal,
              Transaction message, HttpServletRequest request) throws JAXBException, JsonProcessingException {

        switch(.......) {
            case ".......":
                // send here the args via Contructor
                binCountryCheckFilter.validateBinCountryCheckFilter(terminal);                  
                break;
            case ".........":           
                .........
                break;

                break;                                          
            }           
        }
        return null;
    }
}

Но я незнать, как отправить объект terminal через конструктор BinCountryCheckFilterImpl. Есть ли какое-то решение для этого?

1 Ответ

0 голосов
/ 08 ноября 2019

Конструктор предназначен для создания объектов. Вы говорите: «отправьте сюда аргументы через конструктор» - но это означает, что вы должны создавать новый объект типа BinCountryCheckerFilterImpl для каждого запроса, и этот класс определяется не так.

В вашем случае BinCountryCheckFilterImpl - это компонент с одноэлементной областью (по умолчанию), что означает, что в контексте приложения существует только один экземпляр этого класса.

Поэтому вместо использования параметра в конструкторе просто передайте Terminals объект (который создается по запросу) в методе проверки:

@Service
public class BinCountryCheckFilterImpl {

  @Autowired
  private RiskFilterService riskFilterService;

  public void validateBinCountryCheckFilter(Terminals terminal) {

  }
}

Если вам действительно нужно определить BinCountryCheckFilterImpl как прототип, вы должны знать, что прототипы не могут быть внедрены в синглтоныс помощью простой автопроводки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...