Spring Boot Autowired服务中的NullPointerException

时间:2018-09-30 14:38:38

标签: java spring spring-boot dependency-injection nullpointerexception

我正在创建一个Spring Boot应用程序,并且在@Autowired bean中得到了NullPointerException。

我已经检查了注释,并将我的服务接口和类标记为@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为空。

上面是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上找到我的完整项目:

Complete project

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题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的每个实现。