在我的 Config 類中,我有帶有 RestTemplate 的 bean,我必須添加 CurrencyConverterService currencyConverter 因為我在 modelMapper 中使用它。配置類:
@Configuration
@RequiredArgsConstructor
public class Config {
private final CurrencyConverterService currencyConverter;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
... }
但在 currencyConverter 我必須使用 RestTemplate 從 api 獲取當前貨幣匯率,所以我添加了 RestTemplate:
@Service
@RequiredArgsConstructor
public class CurrencyConverterService {
private static String BASE_URL = url...;
private final RestTemplate restTemplate;
private final CurrencyEntityRepository currencyEntityRepository;
當然我得到了錯誤:
Description:
The dependencies of some of the beans in the application context form a cycle:
┌─────┐
| config defined in file [C:\config\Config.class]
↑ ↓
| currencyConverterService defined in file [C\service\CurrencyConverterService.class]
└─────┘
我試圖在 CurrencyService 中將 @Lazy 添加到 restTemplate 但它沒有幫助。
spring.main.allow-circular-references=true 也沒有幫助
uj5u.com熱心網友回復:
關于什么
@Configuration
public class Config {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public ModelMapper modelMapper(final CurrencyConverterService currencyConverter) {
ModelMapper modelMapper = new ModelMapper();
...
}
...
}
當您創建一個 bean 時,您可以將其他 bean 作為引數傳遞
uj5u.com熱心網友回復:
解決方案一:使用 javax.inject.Provider
假設您使用的是 Maven,您可以添加以下依賴項:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
javax.inject.Provider然后在 CurrencyConverterService中注入以下實體RestTemplate:
import javax.inject.Provider;
...
@Service
@RequiredArgsConstructor
public class CurrencyConverterService {
...
private final Provider<RestTemplate> restTemplate;
并使用 檢索實體restTemplate.get()。
但是,在回圈使用的情況下,這仍然會在運行時失敗。
解決方案2:解決回圈依賴
假設您不需要構建CurrencyConverterService更RestTemplate穩定的解決方案,則創建第二個類來生成(RestTemaplate您可以根據需要添加任意數量的類):@Configuration@Component
@Configuration
public class RestTemplateProducer {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
uj5u.com熱心網友回復:
您可以在注入依賴項的類的 @Autowired 頂部撰寫 @Lazy。因為那會打破回圈。但是你必須把它寫在@Autowired 的頂部
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511719.html
標籤:爪哇春天服务爪哇豆
