post请求返回java.lang.nullpointerexception

6jjcrrmo  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(369)

我第一次用spring创建一个web应用程序。
我有两个班,机器和地位。每台机器都有多重状态。
当我为机器创建请求时-没有问题。但我正在尝试创建状态请求,无法使post请求正常工作。
我把状态和机器联系起来了 @ManyToOne 但当我测试在机器中发布状态时,spring返回: 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);
}

}

感谢所有愿意帮助我的人。
这是我在stackoverflow上的第一篇文章,我希望我没有犯错误。
jmp7cifd

jmp7cifd1#

我想是因为 private MachineRepository machineRepository; 不具备 @Autowired 因此注解 MachineRepository spring管理的示例没有被注入,您得到了 NullPointerException .

nhaq1z21

nhaq1z212#

@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);
    }

相关问题