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