我正在创建一个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上找到我的完整项目:
预先感谢您的帮助。
答案 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的每个实现。