NullPointerException в Spring Boot Autowired. - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю приложение Spring Boot и получаю исключение NullPointerException в компоненте @Autowired.

Я проверил аннотации и пометил свои интерфейсы и классы служб как @ Service.

Я также создал файл конфигурации Java, чтобы указать базовые пакеты для сканирования компонентов, но проблема сохраняется.

Пока я представляю свой код:

package gr.parisk85.dnd35cg.helper.skill;

@Service
public class BarbarianSkillStrategy implements SkillStrategy {
    private static final double MAX_RANKS = 4;
    private static final double RANK_COST = 1;

    @Autowired
    private DnDClassService dnDClassService;

    @Override
    public List<CharacterSkillDTO> select(List<DnDSkill> dndSkills) {
        List<CharacterSkillDTO> characterSkillDTOList = dndSkills.stream()
                .map(skill -> CharacterSkillMapper.map(skill))
                .collect(Collectors.toList());
        Optional<DnDClass> dnDClass = dnDClassService.findDnDClassByClassName(Constants.BARBARIAN);
        characterSkillDTOList
                .stream()
                .filter(skill -> dnDClass.get().getClassSkills().contains(skill))
                .forEach(skill -> {
                    skill.setMaxRanks(MAX_RANKS);
                    skill.setRankCost(RANK_COST);
                });
        return characterSkillDTOList;
    }
}

Исключение выдается встрока:

Optional<DnDClass> dnDClass = dnDClassService.findDnDClassByClassName(Constants.BARBARIAN);

Отладчик показывает, что dnDClassService имеет значение null.

Выше SkillStrategyInterface также помечен как @Service:

package gr.parisk85.dnd35cg.helper.skill;

@Service
public interface SkillStrategy {
    List<CharacterSkillDTO> select(List<DnDSkill> dndSkills);
}

Интерфейс DnDClassService:

package gr.parisk85.dnd35cg.service;

@Service
public interface DnDClassService {
    Optional<DnDClass> findDnDClassByClassName(String name);
}

И класс Impl:

package gr.parisk85.dnd35cg.service.impl;

@Service
public class DnDClassServiceImpl implements DnDClassService {
    @Autowired
    private DnDClassRepository dnDClassRepository;

    @Override
    public Optional<DnDClass> findDnDClassByClassName(String name) {
        return dnDClassRepository.findDnDClassByClassName(name);
    }
}

Я также написал класс конфигурации на случай, если я испортил компонентное сканирование:

package gr.parisk85.dnd35cg.config;

@Configuration
@ComponentScan(basePackages = {
        "gr.parisk85.dnd35cg.helper.skill",
        "gr.parisk85.dnd35cg.helper",
        "gr.parisk85.dnd35cg.service",
        "gr.parisk85.dnd35cg.service.impl"
})
public class ApplicationConfig {
}

Вы можете найти мойЗавершить проект на моем github:

Завершить проект

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 30 сентября 2018

Класс SkillStrategyFactory является проблемой:

public class SkillStrategyFactory {

    private static final Map<String, SkillStrategy> skillStrategyMap;

    static {
        skillStrategyMap = new HashMap<>();
        skillStrategyMap.put(Constants.BARBARIAN, new BarbarianSkillStrategy());
    }

    public static SkillStrategy getStrategy(DnDClass dndClass) {
        return skillStrategyMap.get(dndClass.getClassName());
    }
}

Здесь вы сами создаете BarbarianSkillStrategy, используя конструктор по умолчанию.Вы должны позволить Spring сделать это для вас, чтобы Autowiring работал.Таким образом, вы можете внедрить его напрямую или преобразовать фабрику в сервис Spring и внедрить в него каждую реализацию SkillStrategy.

...