Параметру 0 конструктора в требовался bean-компонент типа java.lang.String, который не может быть найден

Я работаю над пакетом 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.

Я проверил ниже

  1. Все компоненты Spring правильно аннотированы @Component, @Service, @ Controller, @ Repository и т. д.
  2. Также предусмотрены @ComponentScan и @EnableAutoCOnfiguration.
  3. Пробовал давать в объявлениях "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;
    }
   }

вы можете добавить код для InputItemReader?

Gaurav Srivastav 16.10.2018 20:17

Это может помочь: stackoverflow.com/questions/51064214/…

Dakshinamurthy Karra 16.10.2018 20:18

есть несколько статей с похожими сообщениями об ошибках: stackoverflow.com/questions/44058210/…

joseph 16.10.2018 20:19

@joseph: Спасибо за ссылки, но я все это пробовал .. Я буду писать фрагменты кода

Ganesh 16.10.2018 20:46

Пожалуйста, прочтите При каких обстоятельствах я могу добавить к своему вопросу «срочно» или другие похожие фразы, чтобы получить более быстрые ответы? - вкратце, это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивно для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.

halfer 16.10.2018 21:51

С Lombok мы можем использовать аннотацию @NoArgsConstructor.

vkstream 20.05.2021 05:18

Это может быть так забавно, но убедитесь, что ваш импорт "весенних стереотипов" - это весенний импорт, а не из других пакетов! Удачного кодирования ..

Marco-Polo 24.07.2021 06:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
38
7
116 399
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Вы определили что-то вроде этого:

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

Я понял вашу точку зрения, но тот же код работает у кого-то другого, а у меня не работает .. я действительно не понял, почему это так? Я добавил код, также не могли бы вы проверить его один раз

Ganesh 16.10.2018 21:03

Как получить inputFilePath? Вы знаете это значение до времени выполнения?

Adina Rolea 16.10.2018 21:10
Ответ принят как подходящий

Поскольку вы не предоставляете общедоступный конструктор по умолчанию и добавляете собственный конструктор, отличный от конструктора по умолчанию, создание экземпляра завершится ошибкой. Я бы посоветовал вам определить путь к входному файлу как свойство типа @Value("${inputFilePath}"). Если вам нужна дальнейшая инициализация в вашем bean-компоненте, определите метод void, аннотируйте его с помощью @PostConstruct и выполните инициализацию внутри.

Да, вот и ответ .. В application.properties отсутствовала переменная inputFilePath .. @v_schoener спасибо ..

Ganesh 29.10.2018 10:41

Кстати, начиная с 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/…

Brice 17.07.2019 14:59

Спасибо, просто решите проблему, предоставив конструктор по умолчанию.

Ornelio Chauque 29.09.2021 21:46

Добавьте общедоступный конструктор по умолчанию в свой класс. Например.

public User() {
}

Только это решило мою проблему

Gank 30.11.2020 10:01

Спасибо, что поделились этим. Это помогло мне решить проблему в моем проекте. Я немного смущен. Многие из моих служебных классов не имеют общедоступного конструктора, даже если я могу создать bean-компонент с помощью настраиваемого конструктора. Но у меня возникла проблема с одним классом обслуживания, которая была решена путем предоставления конструктора по умолчанию. Я создаю bean из класса конфигурации, где значение параметров извлекается из файла свойств.

learner 18.05.2021 22:22

У меня тоже была такая же ошибка:

***************************
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...?

Zap 17.08.2021 14:07

Убедитесь, что вы используете 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 в подзаголовке «Ответить на вопрос»

Nigel Savage 26.01.2020 18:47

в моем случае проблема была в другом.

@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 в служебный файл моего проекта. Эффект заключался в том, что класс не был создан как весенний компонент.

Другие вопросы по теме