0

I am creating a web app with Spring for the first time.

I have 2 class, machine and status. Each machines got multiples status.

When I created the requests for the machines - no problems. But I am trying to create the request for the status and I can't manage to make the POST request work.

I linked the status with the machine using @ManyToOne but when i am testing to post a status in a machine Spring returns : java.lang.NullPointerException: Cannot invoke "com.example.DCT.repository.MachineRepository.findById(Object)" because "this.machineRepository" is null

@Entity
public class Status {

    @Id
    private Long id;
    private String name;
    private Boolean state;
    @ManyToOne
    private Machine machine;
    
    public Machine getMachine() {
        return machine;
    }


    public void setMachine(Machine machine) {
        this.machine = machine;
    }


    public Status() {
        
    }
    
    
    public Status(Long id, String name, Boolean state,Machine machine){
        this.id = Long.valueOf(id);
        this.name = name;
        this.state = state;
        this.machine = machine;
    }
    
    
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Boolean getState() {
        return state;
    }
    public void setState(Boolean state) {
        this.state = state;
    }
@Service
public class StatusServiceImpl {
    
    StatusRepository statusRepository;

    public List<Status> getAllStatus(Long machineId){
        List<Status> status =new ArrayList<>();
        statusRepository.findByMachineId(machineId)
        .forEach(status::add);
        return status;
    }
    
    public Optional<Status> getStatus(Long statusId) {
        return statusRepository.findById(statusId);
    }
    
    public void addStatus(Status status) {
        statusRepository.save(status);
    }
    
    public void updateStatus(Status status) {
        statusRepository.save(status);
    }
    
    public void deleteStatus(Long id) {
        statusRepository.deleteById(id);
    }
    
 }
@RestController
public class StatusControllerImpl {

    @Autowired
    private StatusServiceImpl statusServiceImpl;
    private MachineRepository machineRepository;
    
    @GetMapping("/machines/{machineId}/status")
    public List<Status> getAllStatus(@PathVariable Long machineId){
        return statusServiceImpl.getAllStatus(machineId);
    }
    
    @GetMapping("/machines/{machineId}/status/{statusId}")
    public Optional<Status> getStatus(@PathVariable Long statusId){
        return statusServiceImpl.getStatus(statusId);
    }
    
    @RequestMapping(method=RequestMethod.POST, value="/machines/{machineId}/status")
    public void addStatus(@RequestBody Status status, @PathVariable Long machineId) {
    
        status.setMachine(machineRepository.findById(machineId).get());
        statusServiceImpl.addStatus(status);
    }
    
    @PutMapping("/machines/{machineId}/status/{statusId}")
    public void updateStatus(@RequestBody Status status,@PathVariable Long statusId, @PathVariable Long machineId) {
        status.setMachine(machineRepository.findById(machineId).get());
        statusServiceImpl.updateStatus(status);
    }
    
    @RequestMapping(method=RequestMethod.DELETE, value="/machines/{machineId}/status/{statusId}")
    public void deleteStatus(@PathVariable Long statusId) {
        statusServiceImpl.deleteStatus(statusId);
    }
}

Thanks to anyone who will try to help me.

This is my first post on stackOverflow I hope I'm not doing mistakes.

1
  • you never assign a value to the machineRepository variable in your StatusControllerImpl class, maybe you have to write @Autowired above "private MachineRepository machineRepository;" too (?) Commented Feb 21, 2021 at 14:11

2 Answers 2

1

I think it's due to private MachineRepository machineRepository; doesn't have the @Autowired annotation therefore the MachineRepository instance managed by Spring is not injected and you got the NullPointerException.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks that was the problem thank you for helping me!
1
@Autowired
private StatusServiceImpl statusServiceImpl;
@Autowired
private MachineRepository machineRepository;    

@RequestMapping(method=RequestMethod.POST, 
    value="/machines/{machineId}/status")
    public void addStatus(@RequestBody Status status, @PathVariable Long machineId) 
    {
    if(machineRepository.findById(machineId).get()!=null)
       status.setMachine(machineRepository.findById(machineId).get());
       statusServiceImpl.addStatus(status);
    }

1 Comment

Thanks for the help, Autowired was the problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.