Java 请求的bean当前正在创建中
我的控制器Java 请求的bean当前正在创建中,java,spring,Java,Spring,我的控制器 @RestController public class CheckUserDataRestController { private final UserSearchService userSearchService; @Autowired public CheckUserDataRestController(final UserSearchService userSearchService) { this.userSearchService
@RestController
public class CheckUserDataRestController {
private final UserSearchService userSearchService;
@Autowired
public CheckUserDataRestController(final UserSearchService userSearchService) {
this.userSearchService = userSearchService;
}
...
}
初始化bean服务
@Service("userSearchService")
public class UserSearchServiceImpl implements UserSearchService {
private final UserRepository userRepository;
private final AuthorizationService authorizationService;
@Autowired
public UserSearchServiceImpl(
@NotNull final UserRepository userRepository,
@NotNull final AuthorizationService authorizationService
) {
this.userRepository = userRepository;
this.authorizationService = authorizationService;
}
...
}
它初始化另一个服务bean
@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {
private final UserSearchService userSearchService;
@Autowired
public AuthorizationServiceImpl(final UserSearchService userSearchService) {
this.userSearchService = userSearchService;
}
...
}
编译期间引发以下错误:
2018-04-05 02:09:39.024 WARN 1864 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'checkUserDataRestController' defined in file [C:\Users\Jonatan\Documents\GitHub\REST-Web-Services\web\out\production\classes\com\web\web\controller\CheckUserDataRestController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'userSearchService' defined in file [C:\Users\Jonatan\Documents\GitHub\REST-Web-Services\core\out\production\classes\com\core\jpa\service\UserSearchServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'authorizationService' defined in file [C:\Users\Jonatan\Documents\GitHub\REST-Web-Services\core\out\production\classes\com\core\service\impl\AuthorizationServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'userSearchService': Requested bean is currently in creation: Is there an unresolvable circular reference?
该错误是由以下事实引起的:
UserSearchService
服务在控制器和AuthorizationService
服务中同时自动连接。如何防止此错误?问题是AuthorizationServiceImpl
的构造函数需要连接UserSearchService
的bean,这意味着将连接UserSearchServiceImpl
,但是usersearchserviceinpl
的构造函数需要连接authorizationserviceinpl
的bean(这意味着将连接authorizationserviceinpl
)。此依赖关系是循环的,如果没有开发人员的帮助,Spring无法解决此依赖关系:
AuthorizationServiceImpl
→ <代码>用户搜索服务impl→ <代码>授权ServiceImpl
打破这种循环依赖关系的一种方法是通过而不是通过将UserSearchService
bean注入authorizationserviceinpl
中。这允许Spring创建AuthorizationServiceImpl
bean,而无需创建UserSearchServiceImpl
bean。一旦AuthorizationServiceImpl
被初始化,就可以初始化UserSearchServiceImpl
bean。初始化usersearchserviceinpl
后,可以使用其setter将其连接到authorizationserviceinpl
。这将相关性减少到以下方面:
@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {
private UserSearchService userSearchService;
public AuthorizationServiceImpl() {}
@Autowired
public void setUserSearchService(UserSearchService userSearchService) {
this.userSearchService = userSearchService;
}
...
}
@Service("userSearchService")
public class UserSearchServiceImpl implements UserSearchService {
private final UserRepository userRepository;
private AuthorizationService authorizationService;
@Autowired
public UserSearchServiceImpl(@NotNull final UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
public void setAuthorizationService(AuthorizationService authorizationService) {
this.authorizationService = authorizationService;
}
...
}
UserSearchServiceImpl
→ <代码>授权ServiceImpl
为此,请将authorizationserviceinpl
更改为以下内容:
@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {
private UserSearchService userSearchService;
public AuthorizationServiceImpl() {}
@Autowired
public void setUserSearchService(UserSearchService userSearchService) {
this.userSearchService = userSearchService;
}
...
}
@Service("userSearchService")
public class UserSearchServiceImpl implements UserSearchService {
private final UserRepository userRepository;
private AuthorizationService authorizationService;
@Autowired
public UserSearchServiceImpl(@NotNull final UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
public void setAuthorizationService(AuthorizationService authorizationService) {
this.authorizationService = authorizationService;
}
...
}
和usersearchserviceinpl
到以下内容:
@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {
private UserSearchService userSearchService;
public AuthorizationServiceImpl() {}
@Autowired
public void setUserSearchService(UserSearchService userSearchService) {
this.userSearchService = userSearchService;
}
...
}
@Service("userSearchService")
public class UserSearchServiceImpl implements UserSearchService {
private final UserRepository userRepository;
private AuthorizationService authorizationService;
@Autowired
public UserSearchServiceImpl(@NotNull final UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
public void setAuthorizationService(AuthorizationService authorizationService) {
this.authorizationService = authorizationService;
}
...
}
需要注意的是,这项技术要求
userSearchService
和authorizationService
字段是可变的(删除了final
限定符)。我认为您编写的内容有所帮助,但没有。今天我检查并抛出了错误@Super_Koks,明白了。也可以使用UserSearchService
尝试setter注入(这样两者都有setter注入),看看这是否解决了问题。即通过setter注入将AuthorizationService
注入usersearchserviceinpl
。