gpt4 book ai didi

java - 请求的 bean 当前正在创建中

转载 作者:行者123 更新时间:2023-11-30 07:47:37 25 4
gpt4 key购买 nike

我的 Controller

@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 服务在 Controller 和 AuthorizationService 服务中同时 Autowiring 造成的。如何防止此错误?

最佳答案

问题在于 AuthorizationServiceImpl 的构造函数需要连接 UserSearchService 的 bean,这意味着 UserSearchServiceImpl 将被连接,但是UserSearchServiceImpl 的构造函数需要连接 AuthorizationServiceImpl 的 bean(这意味着将连接 AuthorizationServiceImpl)。这种依赖是循环的,如果没有开发人员的帮助,Spring 无法解决它:

AuthorizationServiceImplUserSearchServiceImplAuthorizationServiceImpl

打破这种循环依赖的一种方法是通过setter injectionUserSearchService bean 注入(inject)到AuthorizationServiceImpl 中。 , 而不是通过 constructor injection .这允许 Spring 创建 AuthorizationServiceImpl bean 而无需创建 UserSearchServiceImpl bean。一旦初始化了 AuthorizationServiceImpl,就可以初始化 UserSearchServiceImpl bean。一旦 UserSearchServiceImpl 被初始化,它就可以使用它的 setter 连接到 AuthorizationServiceImpl 中。这减少了对以下内容的依赖:

UserSearchServiceImplAuthorizationServiceImpl

为此,将 AuthorizationServiceImpl 更改为以下内容:

@Service("authorizationService")
public class AuthorizationServiceImpl implements AuthorizationService {
private UserSearchService userSearchService;

public AuthorizationServiceImpl() {}

@Autowired
public void setUserSearchService(UserSearchService userSearchService) {
this.userSearchService = userSearchService;
}

...

}

UserSearchServiceImpl 到以下内容:

@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;
}

...
}

重要的是要注意,技术要求 userSearchServiceauthorizationService 字段可变(删除 final 限定符)。

关于java - 请求的 bean 当前正在创建中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49662372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com