user1712
user1712

Reputation: 29

Invalid autowire-marked constructor

I have 2 service classes so in controller class 2 @Autowired constructors are there whwn i run this got below exception:

SEVERE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.BeanCreationException: Invalid autowire-marked constructor: public com.spring.controller.HomeController(com.spring.service.ProductService). Found another constructor with 'required' Autowired annotation: public com.spring.controller.HomeController(com.spring.service.CustomerService) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:242) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1040) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1013) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:700) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4766) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Catalina.start(Catalina.java:772) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)

Controller Class

 public class HomeController {
    
    private final CustomerService customerService;
    private final ProductService  productService;
    
     @Autowired
        public HomeController(ProductService productService, CustomerService customerService) {
      this.productService = productService;
      this.customerService = customerService;
    }
    
    
    @RequestMapping(value = { "/CustomerDetailsPage"}, method = RequestMethod.GET)
    public ModelAndView homepage() 
    {
        
        ModelAndView model = new ModelAndView();
        model.setViewName("CustomerDetailsPage");
        return model; 
    }
    
    @RequestMapping(value = {"/addCustomerDetails"}, method = RequestMethod.POST)
    public ModelAndView addCustomerDetails(CustomerDetails cd) 
    {
        customerService.saveCustomer(cd);
        ModelAndView model = new ModelAndView();
        model.setViewName("homepage");
        return model;
    }

Service class

@Service
@Transactional
public class CustomerService  {
    
    private final CdRepo cdRepo;
     
    @Autowired
    public CustomerService(CdRepo cdRepo) {
        
        this.cdRepo = cdRepo;
    }
    public void saveCustomer(CustomerDetails cd) 
    {       
        cdRepo.save(cd);
    }

another service class

@Service
@Transactional
public class ProductService  {

    private final ProductRepo productRepo;
    private final StoredProcedureCall spCall;
    
    @Autowired
    public ProductService(ProductRepo productRepo,StoredProcedureCall spCall) 
    {       
        this.productRepo = productRepo;
        this.spCall = spCall;
    }   
    public void saveProduct(Product product) throws SQLException 
    {
        productRepo.save(product);
        spCall.Procedure();     
    }

Upvotes: 0

Views: 293

Answers (1)

SurPrise 2
SurPrise 2

Reputation: 55

Look into Lombok, especially @RequiredArgsContructor. If you write your own one, you need to have one constructor annotated with @Autowired and 2 parameters:

    @Autowired
    public HomeController(ProductService productService, CustomerService customerService) {
  this.productService = productService;
  this.customerService = customerService;
}

Upvotes: 0

Related Questions