Я работаю над пакетом spring с приложением spring boot 2.X, фактически его существующий код я проверил из 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.
Я проверил ниже
Код:
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;
}
}
Это может помочь: stackoverflow.com/questions/51064214/…
есть несколько статей с похожими сообщениями об ошибках: stackoverflow.com/questions/44058210/…
@joseph: Спасибо за ссылки, но я все это пробовал .. Я буду писать фрагменты кода
Пожалуйста, прочтите При каких обстоятельствах я могу добавить к своему вопросу «срочно» или другие похожие фразы, чтобы получить более быстрые ответы? - вкратце, это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивно для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.
С Lombok мы можем использовать аннотацию @NoArgsConstructor.
Это может быть так забавно, но убедитесь, что ваш импорт "весенних стереотипов" - это весенний импорт, а не из других пакетов! Удачного кодирования ..




Вы определили что-то вроде этого:
@Component
public class InputItemReader{
public InputItemReader(String input){
...
}
}
Название вашего класса предполагает, что ваш объект не является bean-компонентом, а является простым объектом. Попробуйте использовать его классическим способом:
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;
}
Я понял вашу точку зрения, но тот же код работает у кого-то другого, а у меня не работает .. я действительно не понял, почему это так? Я добавил код, также не могли бы вы проверить его один раз
Как получить inputFilePath? Вы знаете это значение до времени выполнения?
Поскольку вы не предоставляете общедоступный конструктор по умолчанию и добавляете собственный конструктор, отличный от конструктора по умолчанию, создание экземпляра завершится ошибкой. Я бы посоветовал вам определить путь к входному файлу как свойство типа @Value("${inputFilePath}").
Если вам нужна дальнейшая инициализация в вашем bean-компоненте, определите метод void, аннотируйте его с помощью @PostConstruct и выполните инициализацию внутри.
Да, вот и ответ .. В application.properties отсутствовала переменная inputFilePath .. @v_schoener спасибо ..
Кстати, начиная с Spring Boot 2.2.x будет поддерживаться неизменяемая конфигурация, а значит, и поддержка внедрения свойств в конструктор. github.com/spring-projects/spring-boot/commit/…, github.com/spring-projects/spring-boot/wiki/…, github.com/spring-projects/spring-boot/wiki/…
Спасибо, просто решите проблему, предоставив конструктор по умолчанию.
Добавьте общедоступный конструктор по умолчанию в свой класс. Например.
public User() {
}
Только это решило мою проблему
Спасибо, что поделились этим. Это помогло мне решить проблему в моем проекте. Я немного смущен. Многие из моих служебных классов не имеют общедоступного конструктора, даже если я могу создать bean-компонент с помощью настраиваемого конструктора. Но у меня возникла проблема с одним классом обслуживания, которая была решена путем предоставления конструктора по умолчанию. Я создаю bean из класса конфигурации, где значение параметров извлекается из файла свойств.
У меня тоже была такая же ошибка:
***************************
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
Я решил эту проблему, добавив аннотацию @EnableMongoRepositories в основной класс:
@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {
public static void main(String[] args) {
SpringApplication.run(CampaignAPI.class, args);
}
}
хороший улов! это решило мою проблему. Однако лучше ли добавить все репозитории вот так? basePackageClasses = Foo1Repository.class, Foo2Repository.class...?
Убедитесь, что вы используете spring-boot-starter-data-jpa
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Всегда полезно предоставить как можно больше контекста. Например, здесь вы не указываете версию в зависимости maven. Вы можете, например, расширить бомбу с пружинной загрузкой и указать, что версия может потребоваться, если бомбы не используются. Это всего лишь пример. Всегда полезно попытаться предоставить хотя бы какой-то контекст, если это возможно. См. Здесь stackoverflow.com/help/how-to-answer в подзаголовке «Ответить на вопрос»
в моем случае проблема была в другом.
@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. Пакет, определенный, не существует. Попробуйте определить этот пакет и будьте осторожны, чтобы интерфейсы репозитория основывались именно на нем. В противном случае Spring не найдет классы репозиториев, которые он должен загрузить!
В моем случае проблема заключалась в избыточном @Autowired, Сначала я добавил зависимость, используя @Autowired, в конце концов закомментировав ее, однако я забыл прокомментировать аннотацию, из-за чего метод рядом с @Autowired считался своего рода установщиком.
При удалении избыточной аннотации он работает нормально.
У меня также была такая же проблема, для меня следующее решение отлично работало:
Я аннотировал свой класс как @AllArgsConstructor, импортировав import lombok.AllArgsConstructor
Я только что удалил эту аннотацию, и код начинает работать.
Надеюсь, это может кому-то помочь.
Я столкнулся с той же проблемой, и она была исправлена путем удаления конструкторов из моего класса модели. Добавляем образец сниппета ниже:
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;
}
Обратите внимание: не храните конструктор / @ AllArgsConstructor в своем классе модели, если только его не нужно декалировать.
У меня была такая же ошибка, но ошибка была сгенерирована Имитировать клиента. Если у вас есть эта ошибка при использовании фейкового клиента, вы должны добавить @EnableFeignClients в свой основной класс:
@SpringCloudApplication
@EnableFeignClients
public class Application {
...
}
Даже после выполнения вышеуказанных решений, если проблема все еще существует, проверьте свои операторы импорта.
В моем случае это был неправильный импорт аннотации @service.
В моем случае аннотирование полей с помощью ломбока @NonNull вызывало проблемы.
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class UserServiceImp implements UserService, UserDetailsService {
....
}
У меня недавно возникла эта проблема, и оказалось, что я не добавлял аннотацию @Component в служебный файл моего проекта. Эффект заключался в том, что класс не был создан как весенний компонент.
вы можете добавить код для InputItemReader?