내 봄 부팅 휴식 서비스 응용 프로그램에서 아래 예외가 발생합니다. 서비스를 시작할 때이 예외가 발생합니다. 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);
}
왜 복잡한 설정입니까? 응용 프로그램 청취자는 실제로 위험합니다. 스프링 부트 종료시 close 메소드가 이미 호출되었습니다. 그래서 그것을 제거하십시오. 'ThrowExceptionIfHandlerNotFound'는'application.properties'를 통해 설정할 수 있으므로이를 해킹 할 필요가 없습니다. 그러면 상황을 해킹 할 필요가 없어지고 문제가 해결 될 것입니다. –
VTMRefUserUpdateHistoryRepository에 @Repository 또는 @Component가 주석으로 추가 되었습니까? – alfcope
'@ CoponentScan' 주석의 가치를 좋아하지 않습니다. 별표가 엉망이라고 생각합니다. 이것을보십시오 :'@ComponentScan ("com.att.vtm")' –