Spring Boot JPA Query Error - исключение «Нет свойства» для типа «» - PullRequest
1 голос
/ 06 апреля 2020

В настоящее время я изучаю онлайн-курс Spring Boot, работающий с Spring Data JPA.

Мой проект включает в себя 2 объекта: BDProject и BDUser, которые имеют отношение многие-к-одному. При попытке найти проекты по идентификатору пользователя отображается следующее исключение:

EXCEPTION

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'BDProjectController': Unsatisfied dependency expressed through field 'bdProjectService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'BDProjectService': Unsatisfied dependency expressed through field 'bdProjectRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BDProjectRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.synopsys.projectdash.bdproject.BDProjectRepository.findByUserID(java.lang.String)! No property userID found for type BDProject!

Я потратил часы, пытаясь выяснить, что является причиной этого исключения, но кажется, ничего не исправляет.

МОЙ КОД:

Сущности

@Entity
public class BDUser {


@Id
private String userID;
private String bdUsername;
private String bdUserEmail;
private String bdUserPassword;

public BDUser(){
}

public BDUser(String userID, String bdUsername, String bdUserEmail, String bdUserPassword) {
    super();
    this.userID = userID;
    this.bdUsername = bdUsername;
    this.bdUserEmail = bdUserEmail;
    this.bdUserPassword = bdUserPassword;
}
// getters and setters...

@Entity
public class BDProject {

@Id
private String proID;
private String proName;
private String proCodeOwner;
private String proIDs;
@ManyToOne
private BDUser bdUser;

public BDProject() {
}

public BDProject(String proID, String proName, String proCodeOwner, String proIDs, String userID) {
    super();
    this.proID = proID;
    this.proName = proName;
    this.proCodeOwner = proCodeOwner;
    this.proIDs = proIDs;
    this.bdUser = new BDUser(userID, "", "", "");
}
// getters and setters...

Контроллер

@RestController
public class BDProjectController {

@Autowired
private BDProjectService bdProjectService;

@RequestMapping("/bdusers/{userID}/bdprojects")
public List<BDProject> getAllProjects(@PathVariable String proID){
    return bdProjectService.getAllProjects(proID);
}

@RequestMapping("/bdusers/{userID}/bdprojects/{proID}")
public BDProject getProject(@PathVariable String proID){
    return bdProjectService.getProject(proID);
}

@RequestMapping(method= RequestMethod.POST, value="/bdusers/{userID}/bdprojects")
public void addProject(@RequestBody BDProject bdProject, @PathVariable String userID){
    bdProject.setBdUser(new BDUser(userID, "", "", ""));
    bdProjectService.addProject(bdProject);
}

@RequestMapping(method= RequestMethod.PUT, value="/bdusers/{userID}/bdprojects/{proID}")
public void updateProject(@RequestBody BDProject bdProject, @PathVariable String userID, @PathVariable String proID){
    bdProject.setBdUser(new BDUser(userID, "", "", ""));
    bdProjectService.updateProject(bdProject);
}

@RequestMapping(method= RequestMethod.DELETE, value="/bdusers/{userID}/bdprojects/{proID}")
public void deleteProject(@PathVariable String proID){
    bdProjectService.deleteProject(proID);
}

}

Сервис

@Service
public class BDProjectService {

@Autowired
private BDProjectRepository bdProjectRepository;

public List<BDProject> getAllProjects(String userID){
    List<BDProject> bdProjects = new ArrayList<>();
    bdProjectRepository.findByUserID(userID).forEach(bdProjects::add);
    return bdProjects;
}

public BDProject getProject(String proID){

    return bdProjectRepository.findById(proID).orElse(null);
}

public void addProject(BDProject BDProject){

    bdProjectRepository.save(BDProject);
}

public void updateProject(BDProject BDProject){

    bdProjectRepository.save(BDProject);
}

public void deleteProject(String proID){

    bdProjectRepository.deleteById(proID);
}

}

Репозиторий

public interface BDProjectRepository extends CrudRepository<BDProject, String>{

    public List<BDProject> findByUserID(String userID);

}

Любой и вся помощь очень ценится. Спасибо!

Ответы [ 4 ]

1 голос
/ 06 апреля 2020

В BDProject у вас есть свойство

private BDUser bdUser;

, а в хранилище у вас есть:

public List<BDProject> findByUserID(String userID);

В сообщении об ошибке указано, что в BDProject у вас нет свойства userID, которое является правильным, поскольку вы иметь bdUser.

Поэтому, пожалуйста, измените

findByUserID(String userID) to findByBdUserUserID(String userID)
0 голосов
/ 06 апреля 2020

Использование findByBdUserUserID(String userID)

В BDProject ваше имя пользователя имеет отношение bdUser, а userID находится внутри BdUser объекта. Поэтому используйте этот способ findBy {Имя объекта пользователя} {UserId объекта пользователя}

public interface BDProjectRepository extends CrudRepository<BDProject, String>{

    public List<BDProject> findByBdUserUserID(String userID);

}
0 голосов
/ 06 апреля 2020

При запросе по полям в ссылочном объекте вы должны написать его как ChildObject_ChildID

public interface BDProjectRepository extends CrudRepository<BDProject, String>
{
    public List<BDProject> findByBdUser_UserID(String userID);
}
0 голосов
/ 06 апреля 2020

Вы создали интерфейс BDProjectRepository для объекта BDProject. Пожалуйста, измените метод в этом хранилище:

сейчас: public List<BDProject> findByUserID(String userID);

должно быть: public List<BDProject> findByProID(String proID);

Если вы хотите получить BDProject для указанного пользователя c вы можете получить его, запросив связанный объект как

public List<BDProject> findByBdUser_UserID(String proID);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...