【问题标题】:Spring - can't create custom query in CrudRepositorySpring - 无法在 CrudRepository 中创建自定义查询
【发布时间】:2015-08-26 11:29:04
【问题描述】:

由于某种原因,我在尝试使用 findByEmail 方法初始化存储库时得到 BeanCreationException。不知道是什么原因,实体中的字段对应于查询中的参数,并且在调度程序servlet中扫描包。

PersonRepository.java

import java.util.List;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import wymysl.model.Person;

@Repository
public interface PersonRepository extends CrudRepository<Person, Long> {

    public List<Person> findByEmail(String Email);

}

Person.java

@Entity
@Table(name = "Persons")
public class Person {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    protected Integer id_per;

    @NotNull
    @Size(min=2, max=30)
    protected String Name;

    @NotNull
    @Size(min=2, max=30)
    protected String Surname;

    @NotNull
    @Email
    protected String Email;

    protected String Contact_email;

    protected String Gender;

    protected String City;

    protected String Country;

    protected String Additional;

    @NotNull
    @Size(min=6, max=15)
    protected String Password;

    @Transient 
    @NotNull
    @Size(min=6, max=15)
    protected String checkPassword;


    public Person(){

    }

    public Person(String name, String surname, String email, String password) {
        this.Name = name;
        this.Surname = surname;
        this.Email = email;
        this.Password = password;
    }


    public Integer getId_per() {
        return id_per;
    }
    public void setId_per(Integer id_per) {
        this.id_per = id_per;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        this.Name = name;
    }
    public String getSurname() {
        return Surname;
    }
    public void setSurname(String surname) {
        this.Surname = surname;
    }
    public String getEmail() {
        return Email;
    }
    public void setEmail(String email) {
        this.Email = email;
    }
    public String getContact_email() {
        return Contact_email;
    }
    public void setContact_email(String contact_email) {
        this.Contact_email = contact_email;
    }
    public String getGender() {
        return Gender;
    }
    public void setGender(String gender) {
        this.Gender = gender;
    }
    public String getCity() {
        return City;
    }
    public void setCity(String city) {
        this.City = city;
    }
    public String getCountry() {
        return Country;
    }
    public void setCountry(String country) {
        this.Country = country;
    }
    public String getAdditional() {
        return Additional;
    }
    public void setAdditional(String additional) {
        this.Additional = additional;
    }
    public String getPassword() {
        return Password;
    }
    public void setPassword(String password) {
        this.Password = password;
    }

    public String getCheckPassword() {
        return checkPassword;
    }

    public void setCheckPassword(String checkPassword) {
        this.checkPassword = checkPassword;
    }

}

PersonValidator.java

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import wymysl.model.Person;
import wymysl.repositories.PersonRepository;

public class PersonValidator implements Validator {

    @Autowired
    PersonRepository repo;

    public boolean supports(Class<?> classz) {
        // TODO Auto-generated method stub
        return Person.class.equals(classz);
    }

    public void validate(Object target, Errors errors) {

        Person person = (Person) target;

        if(!(person.getPassword().equals(person.getCheckPassword()))){
            errors.rejectValue("Password", "password.nonequal");
        }

        List<Person> emailCheck = repo.findByEmail(person.getEmail());

        if(!emailCheck.isEmpty()) {
            errors.rejectValue("Email", "email.exist");
        }

        repo.save(person);

    }

}

完整的错误跟踪:

Could not create query metamodel for method public abstract java.util.List wymysl.repositories.PersonRepository.findByEmail(java.lang.String)!

【问题讨论】:

  • 请添加堆栈跟踪。
  • @Jens 是的,忘记了。现已添加
  • 列表不能有抽象对象,底层框架需要明确列表类型。
  • @Mike 这不是完整的堆栈跟踪。

标签: java spring spring-mvc web-applications


【解决方案1】:

我认为您在存储库接口方法中留下了查询注释::

@Query
public List<Person> findByEmail(String Email);

【讨论】:

  • 我在 spring-data 中的任何地方都没有看到这个注释,也没有在文档中提到它 docs.spring.io/spring-data/data-commons/docs/current/reference/…
  • 注解肯定有:
  • 啊,你是对的,有 petrikainulainen.net/programming/spring-framework/… - 一个 spring-data-jpa 唯一的注释(这就是为什么我没有找到它,nosql ftw :p)并允许你指定自定义 sql 查询(您没有添加它可能会使情况变得更糟?)
  • 很奇怪,这甚至不是自定义查询。回购是否有效,例如保存?是否设置了其他所有内容,例如 persistence.xml 文件?
  • 我想得越多(并且基于错误中的抽象消息),我认为你的 repo 没有被 spring 处理。
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 2016-09-17
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2021-08-28
  • 2018-05-28
  • 2020-08-12
相关资源
最近更新 更多