Spring Boot 使用自定义方法和JpaRepository实现接口

vc9ivgsu  于 2023-10-16  发布在  Spring
关注(0)|答案(1)|浏览(135)

我正在开发一个API Rest,用于学生注册,使用领域驱动设计。所以我的问题是:我正在尝试使用JpaRepository添加一个自定义方法。我的项目层次结构是:

com.wizardry.witchcraft.domain.model.StudentModel;  
com.wizardry.witchcraft.infraestructure.repository.CustomRepositoryImpl;  
com.wizardry.witchcraft.domain.repository.IStudentRepository;  
com.wizardry.witchcraft.domain.repository.ICustomRepository;
com.wizardry.witchcraft.api.controller.TesteController2;
com.wizardry.witchcraft.api.controller.StudentController;

首先我创建了方法Implementation

import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import org.springframework.stereotype.Repository;
    import com.wizardry.witchcraft.domain.model.StudentModel;
    import com.wizardry.witchcraft.domain.repository.ICustomRepository;

        @Repository
        public class CustomRepositoryImpl implements ICustomRepository {
        
        @PersistenceContext
            private EntityManager manager;
            
            @Override
            public List<StudentModel> findCustom (String name){
                //METHOD
    
            }
        
        }

接口:

import com.wizardry.witchcraft.domain.model.StudentModel;

public interface ICustomRepository {

    List<StudentModel> findCustom(String name);

}

为了测试它,我创建了一个新的控制器,以免干扰我的工作控制器TesteController2,它工作得很好。所以我的下一步是在IStudentRepository中扩展ICustomRepository,在TesteController2中进行更改,然后Spring再也找不到我的findCustom方法了,它试图将该方法创建为JPA关键字并返回错误。这是我的repository接口:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.wizardry.witchcraft.domain.model.StudentModel;

@Repository
public interface IStudentRepository extends ICustomRepository, JpaRepository<StudentModel, Long> {
    
      List<StudentModel> queryByName(String name, @Param ("id") Long school);
      
      List<StudentModel> queryFirstByNameContaining(String name);
      
      List<StudentModel> queryTop2ByNameContaining(String name);
      
      int countByWizardingSchoolModelId(Long school);
     

}

TesteController2:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.wizardry.witchcraft.domain.model.StudentModel;
import com.wizardry.witchcraft.domain.repository.IStudentRepository;

@RestController
@RequestMapping(value = "/test")
public class TesteController2 {

    @Autowired
    private IStudentRepository iStudentRepository;

    @ResponseStatus(HttpStatus.ACCEPTED)
    @GetMapping
    public List<StudentModel> findCustom2(String name) {
        return iStudentRepository.findCustom(name);
    }
    
}

PS:我有一个服务层com.wizardry.witchcraft.domain.service.RegisterStudentService,但是有问题的方法没有通过它(还没有!)因为我正在测试,我试图通过服务,看看发生了什么,但给予同样的错误。
错误:org.springframework.beans.factory.UnsatisfiedDependencyException:
创建名为“studentController”的Bean时出错:通过字段“registerStudentService”表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“registerStudentService”的Bean时出错:通过字段“iStudentRepository”表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建在com.wizardry.witchcraft.domain.repository中定义的名为“ISudentRepository”的Bean时出错。在JpaRepositoriesRegistrar上声明的@EnableJpaRepositories中定义的ISudentRepository。EnableJpaRepositoriesConfiguration:调用init方法失败;嵌套异常为java.lang.IllegalArgumentException:无法为方法public abstract java.util.List com.wizardry.witchcraft.domain.repository.ICustomRepository.findCustom(java.lang.String)创建查询!找不到StudentModel类型的属性findCustom!
我真的迷路了。

puruo6ea

puruo6ea1#

只要将类CustomRepositoryImpl重命名为ISudentRepositoryImpl,它就应该可以工作了。

@Repository
    public class IStudentRepositoryImpl implements ICustomRepository {
    
    @PersistenceContext
        private EntityManager manager;
        
        @Override
        public List<StudentModel> findCustom (String name){
            //METHOD

        }
    
    }

下面是Spring的文档
配置如果你使用命名空间配置,仓库基础设施会尝试通过扫描我们在其中找到仓库的包下面的类来自动检测自定义实现。这些类需要遵循命名约定,将名称空间元素的属性repository-impl-postfix附加到找到的存储库接口名称上。此后缀默认为Impl。
https://docs.spring.io/spring-data/data-commons/docs/current-SNAPSHOT/reference/html/#repositories.custom-implementations

相关问题