[英]UnsatisfiedDependencyException autowired on constructor and set not working
I created a custom repository. 我创建了一个自定义存储库 In this repository, i need to access some method of standard repository (findAll), so I added 在这个存储库中,我需要访问标准存储库(findAll)的一些方法,所以我添加了
I used spring boot 我用过春靴
@EntityScan(basePackageClasses = {UserAgendaApplication.class, Jsr310JpaConverters.class})
@SpringBootApplication
public class UserAgendaApplication {
public static void main(String[] args) {
SpringApplication.run(UserAgendaApplication.class, args);
}
}
public interface UsersRepositoryCustom {
public Page<Users> customSearch(UserSearch UserSearch, Pageable page);
}
public interface UsersRepository extends JpaRepository<Users, Integer>, JpaSpecificationExecutor<Users>, UsersRepositoryCustom {
}
@Repository
public class UsersRepositoryImpl implements UsersRepositoryCustom {
@PersistenceContext
private EntityManager em;
private final UsersRepository usersRepository;
@Autowired
public UsersRepositoryImpl(final UsersRepository usersRepository){
this.usersRepository=usersRepository;
}
@Override
public Page<Users> customSearch(UserSearch UserSearch, Pageable page) {
...
return usersRepository.findAll(specification, page);
}
}
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
public UsersServiceImpl(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
private UsersRepository usersRepository;
@Override
public Page<Users> customSearch(UserSearch userSearch, Pageable page) {
usersRepository.customSearch(userSearch, page);
...
}
}
In a controller for a 在控制器中
@Controller
public class UsersController {
private final UsersService usersService;
@Autowired
public UsersController( final usersService usersService){
this.usersService=usersService;
}
}
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'usersController': Unsatisfied dependency expressed through field 'usersService'; org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为'usersController'的bean时出错:通过字段'usersService'表示不满意的依赖关系;
nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'usersServiceImpl' defined in file [/home/alpha/Development/project/UserAgenda/build/classes/main/com/alpha/userAgenda/service/UsersServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; 嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:在文件[/ home / alpha / Development / project / UserAgenda / build / classes / main / com / alpha / userAgenda / service /中定义的名称为'usersServiceImpl'的bean创建时出错UsersServiceImpl.class]:通过构造函数参数0表示的不满意的依赖项; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'usersRepositoryImpl': Bean with name 'usersRepositoryImpl' has been injected into other beans [usersRepository] in its raw version as part of a circular reference, but has eventually been wrapped. 嵌套异常是org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为'usersRepositoryImpl'的bean时出错:名称为'usersRepositoryImpl'的Bean已作为循环引用的一部分注入其原始版本的其他bean [usersRepository]中,但是最终被包裹了。 This means that said other beans do not use the final version of the bean. 这意味着所述其他bean不使用bean的最终版本。 This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example. 这通常是过度渴望类型匹配的结果 - 例如,考虑使用'getBeanNamesOfType'并关闭'allowEagerInit'标志。
I tried to put a autowired on setUsersRepository in the controller and UsersRepositoryImpl but get the same error 我试图在控制器和UsersRepositoryImpl中的setUsersRepository上自动装配但是得到相同的错误
Edit 编辑
public abstract class UsersRepositoryCustom extends SimpleJpaRepository<Users, Integer>
public Page<Users> customSearch(UserSearch userSearch, Pageable page) {
...
}
Because i use SimpleJpaRepository, I don't need anymore UserRepository, but i need to add in UersRepositoryCustom this code 因为我使用SimpleJpaRepository,我不再需要UserRepository,但我需要在UersRepositoryCustom中添加此代码
private final EntityManager entityManager;
private final JpaEntityInformation<Users, Integer> entityInformation;
@Autowired
public UsersRepositoryCustom(final JpaEntityInformation<Users, Integer> entityInformation,
final EntityManager entityManager) {
super(entityInformation, entityManager);
this.entityManager = entityManager;
this.entityInformation = entityInformation;
}
In my UsersServiceImpl who implement UsersService, i have 在我实现UsersService的UsersServiceImpl中,我有
@Autowired
public UsersRepositoryCustom usersRepositoryCustom;
I get 我明白了
Parameter 0 of constructor in .UsersRepositoryImpl required a bean of type 'org.springframework.data.jpa.repository.support.JpaEntityInformation' that could not be found. .UsersRepositoryImpl中构造函数的参数0需要一个无法找到的类型为'org.springframework.data.jpa.repository.support.JpaEntityInformation'的bean。
Edit 2 编辑2
gradle config gradle配置
buildscript {
ext {
springBootVersion = '2.0.0.M2'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'application'
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
mainClassName = 'com.alpha.useragenda.UserAgendaApplication'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.springframework.boot:spring-boot-starter-web')
compile group: 'org.hsqldb', name: 'hsqldb', version: '2.0.0'
compile group: 'org.postgresql', name: 'postgresql', version: '42.1.1'
compile group: 'org.webjars', name: 'bootstrap', version: '3.3.7'
compile group: 'org.webjars.bower', name: 'bootstrap-table', version: '1.11.1'
compile('org.springframework.boot:spring-boot-devtools')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
tasks.withType(JavaCompile) {
options.compilerArgs = ["-Xlint:unchecked", "-Xlint:deprecation", "-parameters"]
}
I think your best shot is to use this 我认为你最好的机会就是使用它
package stack.overflow;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
public interface UsersCrud extends CrudRepository<Users, Long> {
//My other query prototypes here
@Query("select c1 from t1")
public Object customQuery();
}
This way you get the special query with minimal effort. 这样,您可以轻松获得特殊查询。 Otherwise I suggest to follow the advice given in the OP comments (leave repository alone and deal with special case in service 否则,我建议遵循OP评论中给出的建议(单独留下存储库并处理特殊情况下的服务
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.