programing

의 생성자 매개 변수 0에는 'java.lang' 유형의 빈이 필요합니다.String'을 찾을 수 없습니다.

mytipbox 2023. 3. 19. 17:45
반응형

의 생성자 매개 변수 0에는 'java.lang' 유형의 빈이 필요합니다.String'을 찾을 수 없습니다.

spring boot 2.X 어플리케이션으로 spring batch 작업을 하고 있는데, 사실 기존 코드는 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. 모든 스프링 컴포넌트에 @Component, @Service, @Controller, @Repository 등의 주석이 올바르게 부착되어 있습니다.
  2. @ComponentScan & @Enable자동 설정도 준비되어 있습니다.
  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;
    }
   }

공용 기본 생성자를 제공하지 않고 기본 생성자가 아닌 자체 생성자를 추가했으므로 인스턴스화는 실패합니다..@Value("${inputFilePath}") 방법을 하고 void로 을 붙입니다.@PostConstruct그 안에서 초기화를 실시합니다.

클래스에 공용 기본 생성자를 추가합니다.예를들면.

public User() {
}

spring-boot-starter-data-jpa를 사용하고 있는지 확인합니다.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

다음과 같이 정의했습니다.

@Component
public class InputItemReader{

   public InputItemReader(String input){
     ...
   }
}

클래스 이름을 보면 객체는 콩이 아니라 단순한 객체임을 알 수 있습니다.고전적인 방법으로 사용해 보십시오.

new InputItemReader(myString);

또는 String 입력을 처리하는 정적 메서드를 사용합니다.

설명: Spring IoC 컨테이너는 다음과 같은 새로운 InputItemReader 개체를 인스턴스화하려고 합니다.

new InputItemReader( -- WHAT TO PUT HERE? --) 

컨스트럭터 호출에 실패합니다.실제로 무엇을 기대하고 문자열을 입력했는지 알 수 없기 때문입니다.

업데이트: @Component 주석을 삭제하고 다음과 같은 구성으로 콩을 정의하면 문제를 해결할 수 있습니다.

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

저는 롬복의 @AllArgsConstructor 주석을 사용했기 때문입니다.제 코드는 이렇습니다.

@Service
@AllArgsConstructor
public class SampleService {

    @Value("${search.page.size}")
    private Integer pageSize;

    private final SampleRepository sampleRepository;

그런 다음 @AllArgsConstrator를 삭제하고 @RequiredArgsConstrator 주석을 추가했습니다.문제는 해결되었습니다.

@Service
@RequiredArgsConstructor
public class SampleService {

    @Value("${search.page.size}")
    private Integer pageSize;

    private final BatchRepository batchRepository;

같은 에러가 발생했는데 Feign Client에서 에러가 발생하였습니다.위장한 클라이언트를 사용하여 이 오류가 발생할 경우 다음을 추가해야 합니다.@EnableFeignClients「이것들」은 다음과 같습니다.

@SpringCloudApplication
@EnableFeignClients
public class Application {
...
}

저도 같은 오류가 있었습니다.

***************************
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: "Main Class :

@SpringBootApplication
@EnableMongoRepositories(basePackageClasses = CustomerRepository.class)
public class CampaignAPI {

    public static void main(String[] args) {
        SpringApplication.run(CampaignAPI.class, args);
    }
}

저도 같은 문제를 안고 있었습니다.다음의 해결방법은 완벽하게 성공했습니다.

는 반에 을 달았습니다.@AllArgsConstructor에 의한import lombok.AllArgsConstructor

방금 이 주석을 제거했는데 코드가 작동하기 시작합니다.

이게 누군가에게 도움이 되길 바라.

이 경우 용장 @Autowired가 문제였습니다.처음에는 @Autowired를 사용하여 의존관계를 추가했지만, 결국 코멘트를 하지 않았기 때문에 @Autowired 옆에 있는 메서드는 일종의 세터로 간주되었습니다.

중복 주석을 제거하면 올바르게 작동합니다.

위의 해결방법에 따라도 문제가 해결되지 않으면 수입명세서를 확인해 주십시오.

제 경우 @service 주석의 잘못된 Import였습니다.

제 경우 @Service 주석을 놓쳤기 때문에 일단 배치하면 동작합니다.

저 같은 경우에는 사안이 많이 달랐어요.

@SpringBootApplication
@EnableNeo4jRepositories("com.digital.api.repositories") // <-- This was non-existent.
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@EnableNeo4jRepository 주석을 확인합니다.정의된 패키지가 존재하지 않습니다.이 패키지를 정의해 보고 Repository 인터페이스가 이 패키지에 기반을 두고 있는지 확인하십시오.그렇지 않으면 Spring은 로드해야 할 리포지토리 클래스를 찾을 수 없습니다.

저도 같은 문제에 직면해 있었습니다만, Model 클래스에서 Constructors를 삭제함으로써 문제가 해결되었습니다.아래에 샘플 스니펫을 추가하고 있습니다.

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를 유지하지 마십시오.

에는 롬복으로 필드에 주석을 요.@NonNull문제의 원인이었어요

롬복을 수입하다필수 ArgsConstructor;

롬복을 수입하다extern.slf4j.slf4j;

@Service
    @RequiredArgsConstructor
    @Transactional
    @Slf4j
    public class UserServiceImp implements UserService, UserDetailsService {
    ....
    }

최근에 이 문제가 발생했는데 알고 보니 프로젝트의 서비스 파일에 '@Component' 주석을 추가하지 않았습니다.그 결과 수업은 봄콩으로 인스턴스화되지 않았다.

같은 문제에 직면했지만, 자신이 작성한 인터페이스 저장소를 찾을 수 없었습니다.답변은 Spring 2.6.3에 Java 8에 버그가 있다는 것이었습니다.java를 11버전으로 전환한 후 모든 것이 정상입니다.

이러한 문제에 대한 자세한 내용은 https://github.com/spring-projects/spring-boot/issues/6987를 참조하십시오.

에는 이런 입니다.@Component스캔을 하고 싶지 않기 때문에 스캔하지 않는 것이 좋은 예외 코드입니다.서비스상의 예외를 처리하기 위해서 사용하고 있는 것 뿐입니다.또는 내장된 예외에 있는 주석을 삭제하려고 합니다.

내 기계로 작업했다.

JUnit으로 테스트하는 동안 문제가 발생했습니다.@MockBean 주석 작성을 잊어버려서 콩이 없어졌습니다.

위의 문제와는 관련이 없지만 스프링 부트 어플리케이션에서 빈 생성 오류가 발생하여 위의 오류가 발생할 경우 메인 스프링 부스 어플리케이션 부팅 클래스의 @ComponentScan()에서 클래스 경로를 추가했는지 확인하십시오.

내 경우 서비스 인터페이스를 정의하고 실장하는 것을 잊어버렸습니다.이것도 체크해 주세요.

이걸 넣으려면 이걸 넣어야 해@RequiredArgsConstructor내 수업에 주석을 달았고, 그리고 나서 이것을 추가했다.@Value("${inputFilePath}")주석을 사용하여 변수에 액세스합니다.아래를 참조해 주세요.

    @Component
    @RequiredArgsConstructor
    public class InputItemReader extends  FlatFileItemReader<Map<String, 
     Object>> implements StepExecutionListener {

        @Value("${inputFilePath}")
        private inputFilePath;


        //...

    }

레코드를 사용하려고 할 때 이 오류가 발생했습니다.

@Component
public record User(String Name, int Age){}

기록이 필요없다는 것이 판명되었다.@Component. 떼어내는 것만으로 고칠 수 있습니다.

제 경우 설정에서 @EnableJpaReposities 주석을 삭제하면 문제가 해결되었습니다.저장소는 여전히 올바르게 연결되어 있습니다.

이전:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@EnableJpaAuditing
public class PersistenceConfig {

그 후:

@Configuration
@EnableTransactionManagement
@EnableJpaAuditing
public class PersistenceConfig {

언급URL : https://stackoverflow.com/questions/52841620/parameter-0-of-constructor-in-required-a-bean-of-type-java-lang-string-that-co

반응형