ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [에러]Parameter N of method A in B Class required a single bean, but M were found
    웹개발/Micro Service Architecture 2019. 4. 15. 16:18

    원인

    어떤 클래스의 어떤 메소드중 몇번째 파라미터에서 빈이 1개가 필요한데 여러개가 발견되었다고 하는 메세지.

    보통 코드를 잘못짜서 메소드가 어떤 인스턴스를 써야할지 모호함이 발생할때 나는 에러이다.

    @Autowired를 해놓고 또 파라미터로 받고 있다든지...

    내가 코드에서 그렇다면 수정하면될텐데 스프링 프레임워크의 메소드에서 내가 수정할수 있는 빈과 그렇지 않은 빈 중에 모호함이 발생해서 나는 에러였다.

     

    에러메세지

    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Parameter 1 of method BindingHandlerAdvise in org.springframework.cloud.stream.config.BindingServiceConfiguration required a single bean, 
    but 2 were found:
    	- getValidator: defined by method 'getValidator' in class path resource [com/uracle/hecate/auth/core/configuration/MessageSourceConfig.class]
    	- mvcValidator: defined by method 'mvcValidator' in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]
    
    
    Action:
    
    Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
    

     

     

    해결

    이름도 완전 다른데 Validator부분이 비슷해서 모호하다는건지.. 왜인지는 정확히 모르겠지만, 내가 수정할수 있는 빈을 갖다쓰면 안될 상황이기에 그걸 쓰지 말라고 조치해줘야한다. @lazy도 있고 뭐 @Primary도 있고. 근데 @Primary를 붙여버리면 이걸 갖다쓰라는 거니까 의도랑 반대가 된다.

    그래서 내가 수정할 수 있는 빈을 구체화 해줬다.

    빈 네임을 "validator"라고 지었다. 

    그랬더니 모호함이 제거 되었다.

     

    @Configuration
    public class MessageSourceConfig {
    	
    	@Bean
    	public MessageSource messageSource() {
    	    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    	     
    	    //messageSource.setBasename("classpath:message");
    	    messageSource.setBasename("http://localhost:8999/message.properties");
    	    messageSource.setDefaultEncoding("UTF-8");
    	    
    	    return messageSource;
    	}
    	
    	@Bean(name="validator")
    	public LocalValidatorFactoryBean getValidator() {
    	    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    	    bean.setValidationMessageSource(messageSource());
    	    return bean;
    	}
    	
    }
    

     

    댓글

Designed by Tistory.