构造函数的参数 0 需要一个类型为 'java.lang.String' 的 bean,但找不到
Parameter 0 of constructor in required a bean of type 'java.lang.String' that could not be found
我正在使用 spring 启动 2.X 应用程序处理 spring 批处理,实际上它的现有代码是我从 git 中检出的。虽然 运行 应用程序由于以下错误而失败,但仅适用于我,而相同的代码适用于其他人。
s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'inputItemReader' defined in file [C:\Users\XYZ\git\main\batch\CBatchProcessing\target\classes\com\main\batchprocessing\batch\reader\InputItemReader.class]: Unsatisfied dependency expressed through **constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations**: {}
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-10-16 23:23:37.411 ERROR 2384 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
**Parameter 0 of constructor in com.main.batchprocessing.batch.reader.InputItemReader required a bean of type 'java.lang.String' that could not be found.**
Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
我检查了下面
- 所有 Spring 组件都正确注释了 @Component、@Service、@Controller、@Repository 等...
- @ComponentScan & @EnableAutoCOnfiguration 也提供了。
- 尝试在声明中给出 "java.lang.String"。
代码:
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.JsonLineMapper;
import
org.springframework.batch.item.file.separator.JsonRecordSeparatorPolicy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;
@Component
public class InputItemReader extends FlatFileItemReader<Map<String,
Object>> implements StepExecutionListener {
@Autowired
private InputFileHeaderValidator inputFileHeaderValidator;
@Autowired
private FileAuditService fileAuditService;
private final Logger log =
LoggerFactory.getLogger(InputItemReader.class);
private java.lang.String inputFilePath;
public InputItemReader(String inputFilePath) {
setLineMapper(new JsonLineMapper());
setRecordSeparatorPolicy(new JsonRecordSeparatorPolicy());
setResource(new FileSystemResource(inputFilePath));
this.inputFilePath = inputFilePath;
}
}
你定义了这样的东西:
@Component
public class InputItemReader{
public InputItemReader(String input){
...
}
}
你的名字class表明你的对象不是bean,只是一个简单的对象。您应该尝试以 classic 方式使用它:
new InputItemReader(myString);
或者使用静态方法来处理输入字符串。
解释:Spring IoC 容器将尝试像这样实例化一个新的 InputItemReader 对象:
new InputItemReader( -- WHAT TO PUT HERE? --)
并且将无法调用您的构造函数,因为它不知道您实际上期望做什么并输入字符串。
更新:
您的问题可以通过删除 @Component 注释并在这样的配置中定义 bean 来解决:
@Bean
public InputItemReader inputItemReader(InputFileHeaderValidator inputFileHeaderValidator, FileAuditService fileAuditService){
InputItemReader inputItemReader = new InputItemReader("--HERE SHOULD BE ACTUAL PATH---");
// set the required service, a cleaner approach would be to send them via constructor
inputItemReader.setFilteAuditService(fileAuditService);
inputItemReader.setInputFileHeaderValidator(inputFileHeaderValidator);
return inputItemReader;
}
由于您没有提供 public 默认构造函数并且您添加了自己的非默认构造函数,因此实例化将失败。我建议您将输入文件路径定义为 属性,如 @Value("${inputFilePath}")
。
如果您需要在 bean 中进一步初始化,请定义一个 void 方法并用 @PostConstruct
注释它并在其中进行初始化。
在你的class中添加一个public默认构造函数。例如。
public User() {
}
我也遇到了同样的错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field repository in com.example.controller.CampaignController required a bean of type 'com.example.data.CustomerRepository' that could not be found.
Action:
Consider defining a bean of type 'com.example.data.CustomerRepository' in your configuration.de here
我通过在主 class:
中添加 @EnableMongoRepositories
注释解决了这个问题
@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {
public static void main(String[] args) {
SpringApplication.run(CampaignAPI.class, args);
}
}
确保您使用的是 spring-boot-starter-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
就我而言,问题完全不同。
@SpringBootApplication
@EnableNeo4jRepositories("com.digital.api.repositories") // <-- This was non-existent.
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
查看@EnableNeo4jRepositories 注释。定义的包不存在。
尝试定义该包,并注意 Repository 接口基于那里。
否则,Spring 将找不到它应该加载的存储库 类!
我的问题是一个多余的@Autowired,
我最初使用@Autowired 添加了一个依赖项,最终将其注释掉,但是我忘记注释注释了,因为 @Autowired 旁边的方法被认为是某种 setter.
删除冗余注释后它工作正常。
我也遇到了同样的问题,对我来说,以下解决方案非常有效:
我通过导入 import lombok.AllArgsConstructor
将我的 class 注释为 @AllArgsConstructor
我刚刚删除了这个注释,代码开始工作了。
希望这对某人有所帮助。
我遇到了同样的问题,通过从我的模型中删除构造函数解决了这个问题 class。在下面添加示例代码段:
Map<String, ServiceDefinition> serviceDefinitionMapper = new HashMap<>();
A def;
B serviceCharacter;
@Autowired
public Scan(Map<String, ServiceDefinition> serviceDefinitionMapper, A def,
B serviceCharacter) {
super();
this.serviceDefinitionMapper = serviceDefinitionMapper;
this.def = def;
this.serviceCharacter = serviceCharacter;
}
请注意:不要在您的模型中保留任何 Constructor/@AllArgsConstructor class 除非非常需要贴花。
我有同样的错误,但错误是由 Feign Client 产生的。如果你在使用 feign client 时遇到这个错误,你必须在你的 main class:
上添加 @EnableFeignClients
@SpringCloudApplication
@EnableFeignClients
public class Application {
...
}
即使按照上述解决方案,如果问题仍然存在,请检查您的导入语句。
在我的例子中,这是@service 注释的错误导入。
在我的例子中,使用 lombok 注释字段 @NonNull
引起了麻烦。
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class UserServiceImp implements UserService, UserDetailsService {
....
}
我最近遇到了这个问题,原来我没有在项目的服务文件中添加“@Component”注释。结果是 class 没有实例化为 spring bean。
对我来说,是因为使用了lombok的@AllArgsConstructor注解。我的代码是这样的:
@Service
@AllArgsConstructor
public class SampleService {
@Value("${search.page.size}")
private Integer pageSize;
private final SampleRepository sampleRepository;
然后,我删除了@AllArgsConstructor 并添加了@RequiredArgsConstructor 注释。问题已解决。
@Service
@RequiredArgsConstructor
public class SampleService {
@Value("${search.page.size}")
private Integer pageSize;
private final BatchRepository batchRepository;
我遇到了同样的问题,但找不到我自己创建的接口存储库。我的答案是 Spring 2.6.3 与 Java 8 有错误。在我将 java 切换到 11 版本后,一切正常。
我在这里找到了关于此类问题的更多信息https://github.com/spring-projects/spring-boot/issues/6987
在我的例子中,我错过了 @Service 注释,所以一旦我放置它就可以了。
在我的例子中,我遇到了这个问题,但这是因为我在我的异常代码中添加了 @Component
的注释,我不应该这样做,因为我们真的不希望它被扫描,我们是只是用它来处理我们服务中的异常,或者我不知道尝试删除您的 built-in 异常中的注释。
在我的机器上工作
我在使用 JUnit 进行测试时遇到了这个问题。是我忘记创建 @MockBean 注释,这就是 bean 丢失的原因。
我正在使用 spring 启动 2.X 应用程序处理 spring 批处理,实际上它的现有代码是我从 git 中检出的。虽然 运行 应用程序由于以下错误而失败,但仅适用于我,而相同的代码适用于其他人。
s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'inputItemReader' defined in file [C:\Users\XYZ\git\main\batch\CBatchProcessing\target\classes\com\main\batchprocessing\batch\reader\InputItemReader.class]: Unsatisfied dependency expressed through **constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.String' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations**: {}
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-10-16 23:23:37.411 ERROR 2384 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
**Parameter 0 of constructor in com.main.batchprocessing.batch.reader.InputItemReader required a bean of type 'java.lang.String' that could not be found.**
Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
我检查了下面
- 所有 Spring 组件都正确注释了 @Component、@Service、@Controller、@Repository 等...
- @ComponentScan & @EnableAutoCOnfiguration 也提供了。
- 尝试在声明中给出 "java.lang.String"。
代码:
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.JsonLineMapper;
import
org.springframework.batch.item.file.separator.JsonRecordSeparatorPolicy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;
@Component
public class InputItemReader extends FlatFileItemReader<Map<String,
Object>> implements StepExecutionListener {
@Autowired
private InputFileHeaderValidator inputFileHeaderValidator;
@Autowired
private FileAuditService fileAuditService;
private final Logger log =
LoggerFactory.getLogger(InputItemReader.class);
private java.lang.String inputFilePath;
public InputItemReader(String inputFilePath) {
setLineMapper(new JsonLineMapper());
setRecordSeparatorPolicy(new JsonRecordSeparatorPolicy());
setResource(new FileSystemResource(inputFilePath));
this.inputFilePath = inputFilePath;
}
}
你定义了这样的东西:
@Component
public class InputItemReader{
public InputItemReader(String input){
...
}
}
你的名字class表明你的对象不是bean,只是一个简单的对象。您应该尝试以 classic 方式使用它:
new InputItemReader(myString);
或者使用静态方法来处理输入字符串。
解释:Spring IoC 容器将尝试像这样实例化一个新的 InputItemReader 对象:
new InputItemReader( -- WHAT TO PUT HERE? --)
并且将无法调用您的构造函数,因为它不知道您实际上期望做什么并输入字符串。
更新: 您的问题可以通过删除 @Component 注释并在这样的配置中定义 bean 来解决:
@Bean
public InputItemReader inputItemReader(InputFileHeaderValidator inputFileHeaderValidator, FileAuditService fileAuditService){
InputItemReader inputItemReader = new InputItemReader("--HERE SHOULD BE ACTUAL PATH---");
// set the required service, a cleaner approach would be to send them via constructor
inputItemReader.setFilteAuditService(fileAuditService);
inputItemReader.setInputFileHeaderValidator(inputFileHeaderValidator);
return inputItemReader;
}
由于您没有提供 public 默认构造函数并且您添加了自己的非默认构造函数,因此实例化将失败。我建议您将输入文件路径定义为 属性,如 @Value("${inputFilePath}")
。
如果您需要在 bean 中进一步初始化,请定义一个 void 方法并用 @PostConstruct
注释它并在其中进行初始化。
在你的class中添加一个public默认构造函数。例如。
public User() {
}
我也遇到了同样的错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field repository in com.example.controller.CampaignController required a bean of type 'com.example.data.CustomerRepository' that could not be found.
Action:
Consider defining a bean of type 'com.example.data.CustomerRepository' in your configuration.de here
我通过在主 class:
中添加@EnableMongoRepositories
注释解决了这个问题
@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {
public static void main(String[] args) {
SpringApplication.run(CampaignAPI.class, args);
}
}
确保您使用的是 spring-boot-starter-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
就我而言,问题完全不同。
@SpringBootApplication
@EnableNeo4jRepositories("com.digital.api.repositories") // <-- This was non-existent.
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
查看@EnableNeo4jRepositories 注释。定义的包不存在。 尝试定义该包,并注意 Repository 接口基于那里。 否则,Spring 将找不到它应该加载的存储库 类!
我的问题是一个多余的@Autowired, 我最初使用@Autowired 添加了一个依赖项,最终将其注释掉,但是我忘记注释注释了,因为 @Autowired 旁边的方法被认为是某种 setter.
删除冗余注释后它工作正常。
我也遇到了同样的问题,对我来说,以下解决方案非常有效:
我通过导入 import lombok.AllArgsConstructor
@AllArgsConstructor
我刚刚删除了这个注释,代码开始工作了。
希望这对某人有所帮助。
我遇到了同样的问题,通过从我的模型中删除构造函数解决了这个问题 class。在下面添加示例代码段:
Map<String, ServiceDefinition> serviceDefinitionMapper = new HashMap<>();
A def;
B serviceCharacter;
@Autowired
public Scan(Map<String, ServiceDefinition> serviceDefinitionMapper, A def,
B serviceCharacter) {
super();
this.serviceDefinitionMapper = serviceDefinitionMapper;
this.def = def;
this.serviceCharacter = serviceCharacter;
}
请注意:不要在您的模型中保留任何 Constructor/@AllArgsConstructor class 除非非常需要贴花。
我有同样的错误,但错误是由 Feign Client 产生的。如果你在使用 feign client 时遇到这个错误,你必须在你的 main class:
上添加@EnableFeignClients
@SpringCloudApplication
@EnableFeignClients
public class Application {
...
}
即使按照上述解决方案,如果问题仍然存在,请检查您的导入语句。
在我的例子中,这是@service 注释的错误导入。
在我的例子中,使用 lombok 注释字段 @NonNull
引起了麻烦。
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class UserServiceImp implements UserService, UserDetailsService {
....
}
我最近遇到了这个问题,原来我没有在项目的服务文件中添加“@Component”注释。结果是 class 没有实例化为 spring bean。
对我来说,是因为使用了lombok的@AllArgsConstructor注解。我的代码是这样的:
@Service
@AllArgsConstructor
public class SampleService {
@Value("${search.page.size}")
private Integer pageSize;
private final SampleRepository sampleRepository;
然后,我删除了@AllArgsConstructor 并添加了@RequiredArgsConstructor 注释。问题已解决。
@Service
@RequiredArgsConstructor
public class SampleService {
@Value("${search.page.size}")
private Integer pageSize;
private final BatchRepository batchRepository;
我遇到了同样的问题,但找不到我自己创建的接口存储库。我的答案是 Spring 2.6.3 与 Java 8 有错误。在我将 java 切换到 11 版本后,一切正常。
我在这里找到了关于此类问题的更多信息https://github.com/spring-projects/spring-boot/issues/6987
在我的例子中,我错过了 @Service 注释,所以一旦我放置它就可以了。
在我的例子中,我遇到了这个问题,但这是因为我在我的异常代码中添加了 @Component
的注释,我不应该这样做,因为我们真的不希望它被扫描,我们是只是用它来处理我们服务中的异常,或者我不知道尝试删除您的 built-in 异常中的注释。
在我的机器上工作
我在使用 JUnit 进行测试时遇到了这个问题。是我忘记创建 @MockBean 注释,这就是 bean 丢失的原因。