Autowired не работает, но создание объекта вручную работает - PullRequest
1 голос
/ 05 февраля 2020

Я пытался автоматически связать объект в своем классе. Никаких ошибок или исключений не было, но если я вызову такой метод, он просто не будет работать. Что я здесь упустил?

Вот как я автоматически соединяю объект:

    @Autowired
    RetryOnException retry;

    public static void main(String[] args) {
        SpringApplication.run(CimsMigrationSftp100Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        while(retry.shouldRetry()) {
           // More codes here and below
        }

Если я использую RetryOnException retry = new RetryOnException();, он будет работать, и я могу прыгнуть в то время как l oop. В чем разница между внедрением зависимостей и созданием объекта вручную?

Ниже приведено RetryOnException():

import static package.PAUSE_MS;
import static package.POST_MAX_RETRIES;
@Component
public class RetryOnException {

    private int numberOfRetries;
    private int numberOfTriesLeft;
    private long timeToWait;

    public RetryOnException() {
        this(POST_MAX_RETRIES, PAUSE_MS);
    }

    public RetryOnException(int numberOfRetries,
            long timeToWait) {
        this.numberOfRetries = numberOfRetries;
        numberOfTriesLeft = numberOfRetries;
        this.timeToWait = timeToWait;
    }

    /**
     * @return true if there are tries left
     */
    public boolean shouldRetry() {
        return numberOfTriesLeft > 0;
    }

    public void errorOccured() throws Exception {
        numberOfTriesLeft--;
        if (!shouldRetry()) {
            throw new Exception("Retry Failed: Total " + numberOfRetries
                    + " attempts made at interval " + getTimeToWait()
                    + "ms");
        }
        waitUntilNextTry();
    }

    public long getTimeToWait() {
        return timeToWait;
    }

    private void waitUntilNextTry() {
        try {
            Thread.sleep(getTimeToWait());
        } catch (InterruptedException ignored) {
        }
    }

}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Также должна быть аннотация сканирования компонентов, чтобы Spring знал, какие пакеты сканировать для поиска компонентов.

@Configuration
@ComponentScan("com.your.package.withcomponents")
public class AppConfig{}

Ссылки:

  1. Официальная документация
  2. Baeldung
0 голосов
/ 05 февраля 2020

Попробуйте добавить @ Autowired в конструктор вашего RetryOnException класса. У вас есть несколько конструкторов, и Spring не знает, какой из них использовать для создания вашего объекта.

...