Исключение в потоке "restartedMain" java.lang.reflect.InvocationTargetException - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь внедрить интерфейс FortuneService в класс TennisCoach, но я получаю сообщение об ошибке, и если я пытаюсь внедрить его с помощью нового ключевого слова, он работает нормально. Я попробовал это с помощью создания объекта HappyFortuneService. Я пробовал как ниже в классе TennisCoach FortuneService fortuneService = new HappyFortuneService (); но если я пытаюсь внедрить его с помощью конструктора, он выдает ошибку ниже.

Я получаю сообщение об ошибке типа исключения в потоке "restartedMain" java.lang.reflect.InvocationTargetException

package com.annotation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.annotation.coach.Coach;
import com.annotation.coach.FortuneService;
import com.annotation.coach.HappyFortuneService;
import com.annotation.coach.TennisCoach;

@SpringBootApplication
public class Luv2CodeAnnotationApplication {

    private static final Logger logger = LoggerFactory.getLogger(Luv2CodeAnnotationApplication.class);

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

        Coach coach = new TennisCoach();
        logger.info(coach.getDailyWorkout());
        logger.info(coach.getDailyFortune());

    }

}




package com.annotation.coach;

public interface Coach {

    public String getDailyWorkout();
    public String getDailyFortune();
}




    package com.annotation.coach;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;

    import com.annotation.Luv2CodeAnnotationApplication;

    @Component
    public class TennisCoach implements Coach {

        private static final Logger logger = LoggerFactory.getLogger(Luv2CodeAnnotationApplication.class);

        private FortuneService fortuneService;

        public TennisCoach(FortuneService fortuneService) {
            this.fortuneService = fortuneService;
        }
        public TennisCoach() {
        }

        @Override
        public String getDailyWorkout() {
            return "*************Tennis Coach Daily Workout*************";
        }

        @Override
        public String getDailyFortune() {
            logger.info("*********INVOKED***************");
            return fortuneService.getFortune();
        }

    }




    package com.annotation.coach;

    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;

    @Component
    public class HappyFortuneService implements FortuneService {

        @Override
        public String getFortune() {
            return "*************Happy Fortune Service*************";
        }

    }



package com.annotation.coach;

public interface FortuneService {

    public String getFortune();
}

1 Ответ

0 голосов
/ 08 июля 2019

Если вы создаете любой компонент с использованием нового ключевого слова, которое не будет добавлено в контекст приложения Spring, поэтому Coach coach = new TennisCoach ();не добавлено в контекст приложения.Так что класс TennisCoach не признает Autowired FortuneService.

вы можете сделать Autowired, используя Constructor, экземпляр Coach добавляется в качестве аргумента в конструктор при создании Luv2CodeAnnotationApplication.

Ниже приведен измененный код

@ SpringBootApplication

открытый класс Luv2CodeAnnotationApplication {

private static Coach coach;
private static final Logger logger = LoggerFactory.getLogger(Luv2CodeAnnotationApplication.class);

@Autowired
public Luv2CodeAnnotationApplication(Coach coach) {
    Luv2CodeAnnotationApplication.coach = coach;
}

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

  //Coach coach = new TennisCoach();
    logger.info(coach.getDailyWorkout());
    logger.info(coach.getDailyFortune());

}

}

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