2017-02-22 2 views
0

내 봄 부팅 휴식 서비스 응용 프로그램에서 아래 예외가 발생합니다. 서비스를 시작할 때이 예외가 발생합니다. 4 또는 5 시도 후에 서비스를 시작할 수 있습니다. 모든 해결책은 다음과 같습니다. 고맙습니다. 봄 부팅 휴식 서비스 빈 생성 예외

RuntimeException generated in Method : org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBeanand exception messageError creating bean with name 'changeRecordService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.att.vtm.changerecord.services.changerecord.wrapper.IChangeRecordAdapter com.att.vtm.changerecord.services.changerecord.ChangeRecordService.iChangeRecordAdapter; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'injectChangeRecordDaoAdapter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.att.vtm.changerecord.dao.VTMRefUserUpdateHistoryRepository com.att.vtm.changerecord.services.changerecord.wrapper.ChangeRecordDaoAdapter.vTMRefUserUpdateHistoryRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.att.vtm.changerecord.dao.VTMRefUserUpdateHistoryRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 

내 봄 부팅 주요 클래스

@SpringBootApplication(exclude = { HypermediaAutoConfiguration.class }) 
@EnableSwagger2 
@EnableCaching 
public class Application { 

    private static String adapterType; 

    public static String getAdapterType() { 
     return adapterType; 
    } 

    public static void setAdapterType(String adapterType) { 
     Application.adapterType = adapterType; 
    } 

    public static void main(String[] args) { 

     if (args.length != 0) { 
      Application.setAdapterType(args[0]); 

     } else { 
      Application.setAdapterType("DAO"); 
     } 

     try { 

      SpringApplication.run(Application.class, args); 

     } catch (Exception runtimeException) { 
      System.out.println(
        "RuntimeException generated in Method : " + runtimeException.getStackTrace()[1].getClassName() + "#" 
          + runtimeException.getStackTrace()[1].getMethodName() + "and exception message" 
          + runtimeException.getMessage()); 
      // Runtime.getRuntime().addShutdownHook(hook); 
     } 
    } 

    /** 
    * Tweak the connection pool used by Jetty to handle incoming HTTP 
    * minThreads & maxThreads connections 
    * 
    * @param port 
    * @param maxThreads 
    * @param minThreads 
    * @param idleTimeout 
    * @return 
    */ 
    @Bean 
    public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(
      @Value("${server.port}") final String port, 
      @Value("${jetty.threadPool.maxThreads:200}") final String maxThreads, 
      @Value("${jetty.threadPool.minThreads:50}") final String minThreads, 
      @Value("${jetty.threadPool.idleTimeout:60000}") final String idleTimeout) { 

     final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(
       Integer.valueOf(port)); 
     factory.addServerCustomizers(new JettyServerCustomizer() { 
      public void customize(Server server) { 
       final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class); 
       threadPool.setMaxThreads(Integer.valueOf(maxThreads)); 
       threadPool.setMinThreads(Integer.valueOf(minThreads)); 
       threadPool.setIdleTimeout(Integer.valueOf(idleTimeout)); 
      } 

     }); 
     return factory; 
    } 

    @Bean 
    public Docket newsApi() { 
     return new Docket(DocumentationType.SWAGGER_2).groupName("changerecord").apiInfo(apiInfo()).select() 
       .paths(regex("/bsi/.*")).build().directModelSubstitute(XMLGregorianCalendar.class, MixIn.class); 
    } 

    public static interface MixIn { 
     @JsonIgnore 
     public void setYear(int year); 
    } 

    /** 
    * 
    * @return 
    */ 
    private ApiInfo apiInfo() { 
     return new ApiInfoBuilder().title("Catalog Service REST APIs").description("Microservice REST APIs") 
       .termsOfServiceUrl("http://....").contact("TechMahindra").license("TechMahindra Licensed") 
       .licenseUrl("https://techmahindra.com").version("2.0").build(); 
    } 
} 

이 내 컨트롤러 클래스입니다.

@RestController 
@RequestMapping("/bsi/vtm/changerecord") 
public class ChangeRecordController { 

    @Autowired 
    private ChangeRecordService changerecordService; 

    private static final Logger LOG = LoggerFactory.getLogger(ChangeRecordController.class); 

이 내 서비스 클래스입니다.

@org.springframework.stereotype.Service 
public class ChangeRecordService { 
      private static final Logger LOG = LoggerFactory.getLogger(ChangeRecordService.class); 

@Autowired 
private IChangeRecordAdapter iChangeRecordAdapter; 

이 내 알림 도우미

package com.att.vtm.changerecord.services.changerecord.wrapper; 

    public class NotificationHelper { 

    private static final Logger LOG = LoggerFactory.getLogger(NotificationHelper.class); 
    @Autowired 
    private ChangeRecordRepository changeRecordRepository; 

    @Autowired 
    private ImpactedGroupsSearchCriteria impactedGroupsSearchCriteria; 

    @Autowired 
    private TechnologiesSearchCriteria technologiesSearchCriteria; 

    @Autowired 
    private SearchGroupRepository searchGroupRepository; 

    @Autowired 
    private CbusEmailClient client; 

    @Autowired 
    private NotificationTrackingRepository notificationTrackingRepository; 

    @Autowired 
    private VTMRefUserUpdateHistoryRepository userUpdateHistoryRepository; 


    @Value("${vtm.url.service.userMgmt.getProfile}") 
    private String userMgmtServiceURL; 

이것은 내 InjectConfiguration입니다

public class ChangeRecordDaoAdapter extends IChangeRecordAdapter { 

    private static final Logger LOG = LoggerFactory.getLogger(ChangeRecordDaoAdapter.class); 

    @Autowired 
    private VTMRefUserUpdateHistoryRepository vTMRefUserUpdateHistoryRepository; 

    @Autowired 
    private NotificationHelper notificationHelper; 

    @Autowired 
    private SearchRepository searchRepository; 

    @Autowired 
    private CounterRepository counterRepository; 

    @Autowired 
    private ProducerConfiguration producerConfiguration; 


    @Autowired 
    private ChangeRecordRepository changerecordRepository; 

변경 기록 IMPL입니다

package com.att.vtm.changerecord.conditionalinjection; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Conditional; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 

import com.att.vtm.changerecord.services.approverreviewer.wrapper.ApproverReviewerDaoAdapter; 
import com.att.vtm.changerecord.services.changerecord.wrapper.ChangeRecordDaoAdapter; 
import com.att.vtm.changerecord.services.changerecord.wrapper.ChangeRecordMetadataDaoAdapter; 
import com.att.vtm.changerecord.services.changerecord.wrapper.ChangeRecordReportAdapter; 
import com.att.vtm.changerecord.services.changerecord.wrapper.ChangeRecordTaskDaoAdapter; 
import com.att.vtm.changerecord.services.changerecord.wrapper.NotificationHelper; 
import com.att.vtm.crjob.services.crjob.wrapper.CRJobDaoAdapter; 
import com.att.vtm.crjob.services.crjob.wrapper.DeviceTestJobsDaoAdapter; 


@Configuration 
public class InjectionConfiguration { 

    @Value("${db.driver}") 
    private String DB_DRIVER; 

    @Value("${db.password}") 
    private String DB_PASSWORD; 

    @Value("${db.url}") 
    private String DB_URL; 

    @Value("${db.username}") 
    private String DB_USERNAME; 


    @Bean 
    @Conditional(DaoCondition.class) 
    public ChangeRecordDaoAdapter injectChangeRecordDaoAdapter() throws Exception{ 
     System.out.println("***INJECTING ChangeRecordDaoAdapter...****"); 
     return new ChangeRecordDaoAdapter(); 
    } 

    @Bean 
    @Conditional(DaoCondition.class) 
    public ChangeRecordMetadataDaoAdapter injectChangeRecordMetadataDaoAdapter() throws Exception{ 
     System.out.println("***INJECTING ChangeRecordMetadataDaoAdapter...****"); 
     return new ChangeRecordMetadataDaoAdapter(); 
    } 

    @Bean 
    @Conditional(DaoCondition.class) 
    public NotificationHelper injectNotificationHelper() throws Exception{ 
     System.out.println("***INJECTING NotificationHelper...****"); 
     return new NotificationHelper(); 
    } 

    @Bean 
    @Conditional(DaoCondition.class) 
    public ChangeRecordTaskDaoAdapter injectChangeRecordTaskDaoAdapter() throws Exception{ 
     System.out.println("***INJECTING ChangeRecordTaskDaoAdapter...****"); 
     return new ChangeRecordTaskDaoAdapter(); 
    } 

    @Bean 
    @Conditional(DaoCondition.class) 
    public CRJobDaoAdapter injectCRJobDaoAdapter() throws Exception{ 
     System.out.println("***INJECTING CRJob DAO ADAPTER...****"); 
     return new CRJobDaoAdapter(); 
    } 


    @Bean 
    @Conditional(DaoCondition.class) 
    public DeviceTestJobsDaoAdapter injectDeviceTestJobsDaoAdapter() throws Exception{ 
     System.out.println("***INJECTING DeviceTestJobs DAO ADAPTER...****"); 
     return new DeviceTestJobsDaoAdapter(); 
    } 

    @Bean 
    @Conditional(DaoCondition.class) 
    public ChangeRecordReportAdapter injectChangeRecordReportAdapter() throws Exception{ 
     System.out.println("***....INJECTING DeviceTestJobs DAO ADAPTER.......****"); 
     return new ChangeRecordReportAdapter(); 
    } 

    @Bean 
    @Conditional(DaoCondition.class) 
    public ApproverReviewerDaoAdapter injectApproverReviewerDaoAdapter() throws Exception{ 
     System.out.println("***....INJECTING ApproverReviewerDaoAdapter.......****"); 
     return new ApproverReviewerDaoAdapter(); 
    } 

    @Bean 
    public JdbcTemplate jdbcTemplate() 
    { 
     System.out.println("***INJECTING get jdbcTemplate ...****"); 
     return new JdbcTemplate(dataSource()); 
    } 

    @Bean 
    public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    System.out.println("***INJECTING dataSource DAO ADAPTER...****"); 
    System.out.println(" DriverName :"+DB_DRIVER); 
    System.out.println(" DB_URL :"+DB_URL); 
    System.out.println(" DB_USERNAME :"+DB_USERNAME); 
    System.out.println(" DB_PASSWORD :"+DB_PASSWORD); 

    dataSource.setDriverClassName(DB_DRIVER); 
    dataSource.setUrl(DB_URL); 
    dataSource.setUsername(DB_USERNAME); 
    dataSource.setPassword(DB_PASSWORD); 
    return dataSource; 
    } 

} 

이것은 당신은 당신의 서비스에 대해 @Service 주석을 추가 할 필요가 내 VTMRefUpdateRepository

package com.att.vtm.changerecord.dao; 

import java.util.List; 

import org.springframework.data.mongodb.repository.MongoRepository; 
import org.springframework.data.mongodb.repository.Query; 

import com.att.vtm.changerecord.dto.VTMRefUserUpdateHistory; 

public interface VTMRefUserUpdateHistoryRepository extends MongoRepository<VTMRefUserUpdateHistory, String> { 
    // @Query("select * from VTMRefUserUpdateHistory a where v.ticketNo = ?1") 
    @Query("{ 'ticketNo' : ?0 }") 
    public List<VTMRefUserUpdateHistory> findByTicketNo(String ticketNo); 

    // @Query("select * from VTMRefUserUpdateHistory a where v.pRNumber = ?1") 
    @Query("{ 'pRNumber' : ?0 }") 
    public List<VTMRefUserUpdateHistory> findByPRNumber(String pRNumber); 

    // @Query("select * from VTMRefUserUpdateHistory a where v.cRNumber = ?1") 
    @Query("{ 'cRNumber' : ?0 }") 
    public List<VTMRefUserUpdateHistory> findByCRNumber(String cRNumber); 


    public List<VTMRefUserUpdateHistory> findByCRNumberAndFieldNameAndNewValue(String cRNumber, String fieldName, String newValue); 
} 
+0

왜 복잡한 설정입니까? 응용 프로그램 청취자는 실제로 위험합니다. 스프링 부트 종료시 close 메소드가 이미 호출되었습니다. 그래서 그것을 제거하십시오. 'ThrowExceptionIfHandlerNotFound'는'application.properties'를 통해 설정할 수 있으므로이를 해킹 할 필요가 없습니다. 그러면 상황을 해킹 할 필요가 없어지고 문제가 해결 될 것입니다. –

+0

VTMRefUserUpdateHistoryRepository에 @Repository 또는 @Component가 주석으로 추가 되었습니까? – alfcope

+0

'@ CoponentScan' 주석의 가치를 좋아하지 않습니다. 별표가 엉망이라고 생각합니다. 이것을보십시오 :'@ComponentScan ("com.att.vtm")' –

답변

0

입니다. 당신의 IChangeRecordAdapter 클래스

@Service 
public class ChangeRecordService { 
    // your code 
} 

도 확인, 다음을 시도

+0

참새 감사합니다. 서비스 주석이 이미 있습니다. 방금 내 게시물을 편집했습니다. 다른 제안은 감사하겠습니다. – user3911339

0

귀하의 코드는 ApplicationListener 적어도 필요하지 않습니다 및하여 DispatcherServlet의 속성은 단순히 그것을 지정을 통해 설정할 수 있습니다, 결함이 application.properties.

먼저 application.propertiesspring.mvc.throw-exception-if-no-handler-found=true을 추가하고 DispatcherServlet을 가져오고 수정하지 마십시오.

이제 응용 프로그램의 간단한 시작으로 Application 클래스가 줄어 듭니다. 나는 또한 빈으로 JettyEmbeddedServletContainerFactory 만 맞춤 설정을 추가하지 제안

@SpringBootApplication 
@EnableSwagger2 
@ComponentScan("com.att.vtm.*") 
@EnableAutoConfiguration(exclude = {HypermediaAutoConfiguration.class}) 
@EnableCaching 
@EnableMongoRepositories(value = { "com.att.vtm" }) 


public class Application { 

    private static String adapterType; 

    public static String getAdapterType(){ 
     return adapterType; 
    } 

    public static void setAdapterType(String adapterType){ 
     Application.adapterType = adapterType; 
    } 

    public static void main(String[] args) { 

     if(args.length != 0){ 
      Application.setAdapterType(args[0]); 

     }else{ 
      Application.setAdapterType("DAO"); 
     } 

     try{ 

      SpringApplication.run(Application.class, args); 

     } 
     catch(Exception runtimeException){ 
      System.out.println("RuntimeException generated in Method : "+ runtimeException.getStackTrace()[1].getClassName() 
        +"#"+runtimeException.getStackTrace()[1].getMethodName() 
        +"and exception message"+runtimeException.getMessage()); 
      //Runtime.getRuntime().addShutdownHook(hook); 
     }  
    } 

    /** 
    * Tweak the connection pool used by Jetty to handle incoming HTTP minThreads & maxThreads connections 
    * @param port 
    * @param maxThreads 
    * @param minThreads 
    * @param idleTimeout 
    * @return 
    */ 
    @Bean 
    public JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(@Value("${server.port}") final String port, 
       @Value("${jetty.threadPool.maxThreads:200}") final String maxThreads, 
       @Value("${jetty.threadPool.minThreads:50}") final String minThreads, 
       @Value("${jetty.threadPool.idleTimeout:60000}") final String idleTimeout) { 

       final JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory(Integer.valueOf(port)); 
       factory.addServerCustomizers(new JettyServerCustomizer() { 
       public void customize(Server server) { 
       final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class); 
       threadPool.setMaxThreads(Integer.valueOf(maxThreads)); 
       threadPool.setMinThreads(Integer.valueOf(minThreads)); 
       threadPool.setIdleTimeout(Integer.valueOf(idleTimeout)); 
      } 

     }); 
    return factory; 
    } 

    @Bean 
    public Docket newsApi() { 
     return new Docket(DocumentationType.SWAGGER_2) 
       .groupName("changerecord") 
       .apiInfo(apiInfo()) 
       .select()    
       .paths(regex("/bsi/.*")) 
       .build() 
       .directModelSubstitute(XMLGregorianCalendar.class, MixIn.class); 
    } 

    public static interface MixIn { 
     @JsonIgnore 
     public void setYear(int year); 
    } 

    /** 
    * 
    * @return 
    */ 
    private ApiInfo apiInfo() { 
     return new ApiInfoBuilder() 
       .title("Catalog Service REST APIs") 
       .description("Microservice REST APIs") 
       .termsOfServiceUrl("http://....") 
       .contact("TechMahindra") 
       .license("TechMahindra Licensed") 
       .licenseUrl("https://techmahindra.com") 
       .version("2.0") 
       .build(); 
    } 
} 

는 봄 부팅들을 감지하고이 적용됩니다. JettyEmbeddedServletContainerFactoryJettyServerCustomizer으로 바꿉니다.

@Bean 
public JettyServerCustomizer threadPoolCustomizer(Value("${jetty.threadPool.maxThreads:200}") final Integer maxThreads, 
      @Value("${jetty.threadPool.minThreads:50}") final Integer minThreads, 
      @Value("${jetty.threadPool.idleTimeout:60000}") final Integer idleTimeout) { 
    return new JettyServerCustomizer() { 
     public void customize(Server server) { 
      final QueuedThreadPool threadPool = server.getBean(QueuedThreadPool.class); 
      threadPool.setMaxThreads(maxThreads); 
      threadPool.setMinThreads(minThreads); 
      threadPool.setIdleTimeout(idleTimeout); 
     } 
} 

이 모두가 당신의 Application 클래스의 복잡성을 줄일 수 있습니다.

그러나 여기서 중요한 문제는 수신기를 참조하고 정적을 사용하여 물건을 참조하는 것입니다. 언급했듯이 필요하지 않습니다.

고려해야 할 다른 사항은 com.att.vtm 패키지에 Application 클래스를 넣는 것이 좋습니다 (이미없는 경우). 이를 통해 수업에서 특수 효과를 정리할 수 있습니다. 주석의

@SpringBootApplication(exclude = {HypermediaAutoConfiguration.class}) 
@EnableSwagger2 
@EnableCaching 
public class Application { ... } 

대부분은 이미 @SpringBootApplication에 의해 inmplied하고 나는 당신의 이점에 그것을 활용하는 것이 좋습니다.

업데이트 1

귀하의 JDBC 구성 /도 spring.datasource 특성에 db.* 속성의 이름을 변경하고 InjectionConfiguration에서 JdbcTemplateDataSource 생성을 제거하고 스프링 부팅이 그것을 처리하도록 application.properties에 있어야합니다 수 있습니다. 그런 다음 별도의 @Bean 메서드 대신 클래스에 @Conditional을 추가합니다.

spring.datasource.driver-class-name=${db.driver} 
spring.datasource.url=${db.url} 
spring.datasource.username=${db.username} 
spring.datasource.password=${db.password} 

참고 :이이 spring.datasource.url 속성에서 추론 될 때 당신은 아마 spring.datasource.driver-class-name을 남길 수 있습니다.

+0

제안 사항을 변경했습니다. 예외가 발생했습니다. 다른 해결책을 제안하십시오. – user3911339

+0

질문에 대한 추가 삭제 항목을 추가했으며 질문에 'DaoCondition'을 추가 할 수 있습니까? –

+0

안녕하세요, 모두 클래스 NotificationHelper 및 ChangeRecordDaoAdapter 클래스를 통해가 봐 주시겠습니까 .VRRUUpdateHistoryRepository VmRefUserUpdateHistoryRepository뿐만 아니라 클래스 authired NotificationHelper있는 ChangeRecordDaoAdapter. 문제가 있습니까? 주기적으로 문제가 autowring 문제가 있습니다. 제발 도와주세요. 문제를 해결할 수 있습니다. – user3911339