Controller:
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class FunctionalRequirementController {
@Autowired
RequirementRepository requirementRepository;
@Autowired
private RequirementStrategy requirementStrategy;
RequirementRepository strategy = requirementStrategy.findStrategy(Requirement.FunctionalRequirement);
@GetMapping("/FunctionalRequirement")
public List<Requirement> getAllFunctionalRequirements() {
return requirementRepository.findAll();
}
@GetMapping("/FunctionalRequirement/{id}")
public Requirement getRequirementById(@PathVariable(value = "id") Long requirementId) {
return requirementRepository.findById(requirementId).orElseThrow();
}
}
FunctionalRequirement:
import javax.persistence.*;
import org.springframework.stereotype.Component;
@Table(name = "functionalrequirement")
@Entity
@Component
public abstract class FunctionalRequirement implements RequirementRepository {
@Override
public Requirement getStrategyName() {
return Requirement.FunctionalRequirement;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "idrisorsa")
private Risorsa risorsa;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "idaction")
private Action action;
public Risorsa getRisorsa() {
return risorsa;
}
public void setRisorsa(Risorsa risorsa) {
this.risorsa = risorsa;
}
public Action getAction() {
return action;
}
public void setAction(Action action) {
this.action = action;
}
}
Requirement:
public enum Requirement {
FunctionalRequirement,
NonFunctionalRequirement
}
RequirementStrategy:
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class RequirementStrategy {
private Map<Requirement, RequirementRepository> requirements;
@Autowired
public RequirementStrategy(Set<RequirementRepository> strategySet) {
createStrategy(strategySet);
}
public RequirementRepository findStrategy(Requirement strategyName) {
return requirements.get(strategyName);
}
private void createStrategy(Set<RequirementRepository> strategySet) {
requirements = new HashMap<Requirement, RequirementRepository>();
strategySet.forEach(strategy -> requirements.put(strategy.getStrategyName(), strategy));
}
}
RequirementRepository:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface RequirementRepository extends JpaRepository<Requirement, Long> {
Requirement getStrategyName();
}
The error is:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'functionalRequirementController' defined in file [\Controllers\FunctionalRequirementController.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [Controllers.FunctionalRequirementController]: Constructor threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "Model.RequirementStrategy.findStrategy(Model.Requirement)" because "this.requirementStrategy" is null
Someone knows how to resolve? Thanks for help