【问题标题】:No property findOne() found for type class User找不到类型类 User 的属性 findOne()
【发布时间】:2018-09-24 02:42:50
【问题描述】:

我已经搜索了很多页面,但没有找到答案,所以我粘贴了整个代码。我正在测试 testclass 并收到类似“Caused by: org.springframework.beans.factory.BeanCreationException: Error created bean with name ' userRepository':调用 init 方法失败;嵌套异常是 java.lang.IllegalArgumentException:无法为方法 public abstract org.home.mysystem.entity.User org.home.mysystem.repository.UserRepository.findOne(java.lang 创建查询.String)!找不到类型 User! 的属性 findOne!”。请有人帮助我

角色.java

package org.home.mysystem.entity;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Role {

    @Id
    private String name;
    @ManyToMany(mappedBy = "roles")
    private List<User> users;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public Role(String name, List<User> users) {
        this.name = name;
        this.users = users;
    }

    public Role() {
    }

    public Role(String name) {
        this.name = name;
    }

}

Task.java

package org.home.mysystem.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotEmpty
    private String date;
    @NotEmpty
    private String startTime;
    @NotEmpty
    private String stopTime;
    @NotEmpty
    @Column(length=1000)
    private String description;
    @ManyToOne
    @JoinColumn(name="USER_EMAIL")
    private User user;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public String getStartTime() {
        return startTime;
    }
    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }
    public String getStopTime() {
        return stopTime;
    }
    public void setStopTime(String stopTime) {
        this.stopTime = stopTime;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public Task(String date, String startTime, String stopTime, String description, User user) {
        this.date = date;
        this.startTime = startTime;
        this.stopTime = stopTime;
        this.description = description;
        this.user = user;
    }
    public Task(String date, String startTime, String stopTime, String description) {
        this.date = date;
        this.startTime = startTime;
        this.stopTime = stopTime;
        this.description = description;
    }
    public Task() {
    }



}

用户.java

package org.home.mysystem.entity;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class User {

    @Id
    @Email
    @NotEmpty
    @Column(unique = true)
    private String email;
    @NotEmpty
    private String name;
    @Size(min = 4)
    private String password;
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Task> tasks;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "USER_ROLES", joinColumns={
            @JoinColumn(name = "USER_EMAIL", referencedColumnName = "email") }, inverseJoinColumns = {
                    @JoinColumn(name = "ROLE_NAME", referencedColumnName = "name") })
    private List<Role> roles;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public List<Task> gettasks() {
        return tasks;
    }

    public void settasks(List<Task> tasks) {
        this.tasks = tasks;
    }

    public List<Role> getRoles() {
        return roles;
    }

    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }

    public User(String email, String name, String password) {
        this.email = email;
        this.name = name;
        this.password = password;
    }

    public User() {

    }

}

RoleRepository.java

    package org.home.mysystem.repository;

    import org.home.mysystem.entity.Role;
    import org.springframework.data.jpa.repository.JpaRepository;

    public interface RoleRepository extends JpaRepository<Role, String> {

    }

TaskRepository.java

 public interface TaskRepository extends JpaRepository<Task, Long> {

        List<Task> findByUser(User user);

    }

UserRepository.java

package org.home.mysystem.repository;

import org.home.mysystem.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User,String> {

    User findOne(final String email);

}

TaskService.java

 package org.home.mysystem.service;

    import java.util.ArrayList;
    import java.util.List;

    import org.home.mysystem.entity.Role;
    import org.home.mysystem.entity.Task;
    import org.home.mysystem.entity.User;
    import org.home.mysystem.repository.TaskRepository;
    import org.home.mysystem.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.stereotype.Service;



    @Service
    public class TaskService {

        @Autowired
        private TaskRepository taskRepository;

        public void addTask(Task task, User user) {
            task.setUser(user);
            taskRepository.save(task);
        }

        public List<Task>  findUserTask(User user){

            return taskRepository.findByUser(user);
        }
    }

用户服务.java

import java.util.ArrayList;
import java.util.List;

import org.home.mysystem.entity.Role;
import org.home.mysystem.entity.User;
import org.home.mysystem.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;



@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void createUser(User user) {
        BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
        user.setPassword(encoder.encode(user.getPassword()));
        Role userRole=new Role("USER");
        List<Role> roles=new ArrayList<>();
        roles.add(userRole);
        user.setRoles(roles);
        userRepository.save(user);
    }

    public void createAdmin(User user) {
        BCryptPasswordEncoder encoder=new BCryptPasswordEncoder();
        user.setPassword(encoder.encode(user.getPassword()));
        Role userRole=new Role("ADMIN");
        List<Role> roles=new ArrayList<>();
        roles.add(userRole);
        user.setRoles(roles);
        userRepository.save(user);
    }

    public User findOne(String email) {
        return userRepository.findOne(email);
    }
}

MyApplicationTest.java

package org.home.mysystem;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.List;

import org.home.mysystem.entity.Task;
import org.home.mysystem.entity.User;
import org.home.mysystem.service.TaskService;
import org.home.mysystem.service.UserService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class MySystemApplicationTests {

    @Autowired
    private UserService userService;

    @Autowired
    private TaskService taskService;

    @Before
    public void initDb() {
      {
          User newUser = new User("testUser@mail.com", "testUser", "123456");
          userService.createUser(newUser); 
      }
      {
          User newUser = new User("testAdmin@mail.com", "testAdmin", "123456");
          userService.createUser(newUser); 
      }

      Task userTask = new Task("03/01/2018", "00:11", "11:00", "You need to work today");
      User user = userService.findOne("testUser@mail.com");
      taskService.addTask(userTask, user);  

    }

    @Test
    public void testUser() {
        User user=userService.findOne("testUser@mail.com");
        assertNotNull(user);
        User admin=userService.findOne("testAdmin@mail.com");
        assertEquals(admin.getEmail(),"testAdmin@mail.com");
    }

    @Test
    public void testTask() {
        User user=userService.findOne("testUser@mail.com");
        List<Task> task=taskService.findUserTask(user);
        assertNotNull(task);
    }

    }

【问题讨论】:

  • spring-data-jpa 中的什么让您认为 findOne() 是有效的方法名称?该方法应该生成什么查询?
  • 它应该生成一个 User 类的对象
  • 这不能回答问题。请指出,在 spring-data-jpa 文档中,您发现 findOne() 是一个有效的查询方法,以及它应该做什么。 (提示:正如错误消息所说,它不是有效的查询方法。因此,请阅读文档以找到您可以定义的有效查询方法。还请阅读 JpaRepository 的文档,以便您意识到它已经 有一个方法允许通过 ID 查找实体)。

标签: spring hibernate spring-mvc spring-boot spring-data-jpa


【解决方案1】:

问题是 Spring 在你给它的时候期待别的东西。

findOne 默认定义为采用 ID(主键)来加载实体。所以它需要longLong(据我所知)。它采用给定参数的名称(电子邮件),并正在搜索具有该名称的 ID,而这根本不会加起来。

如果您想通过电子邮件或您定义的其他字段进行搜索,您需要使用以下语法:

示例 1

要搜索的示例字段:email

存储库中的方法: User findByEmail(String email)

示例 2

要搜索的示例字段:username

存储库中的方法: User findByUsername(String username)

我希望这会有所帮助!

【讨论】:

  • 你是个天才的suprebbbbbb
  • 感谢上帝保佑你
  • 您的感激之情方式,但非常欢迎您!很高兴它奏效了。对于未来,我建议先查阅文档,因为那里已经明确定义了。
  • 这成功了!非常感谢!为什么我上周没有看到这个答案!
猜你喜欢
  • 2016-08-29
  • 2017-12-16
  • 2018-07-30
  • 2022-01-18
  • 2019-10-20
  • 2021-03-14
  • 2022-12-09
  • 2019-02-20
相关资源
最近更新 更多