Programmers learn & share
0 votes
72 views

Problem :

I have created entities, services and JUnit tests for services using Spring and Hibernate for my project. All of these are working. After that I added spring-mvc to it to make this web application but while trying to make Controller with @Autowired annotation, I am getting errors from Glassfish during deployment as follows.

Error:

SEVERE:   Exception while loading the app

SEVERE:   Undeployment failed for context /WebMail

SEVERE:   Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.com.radzikowski.webmail.service.MailManager] 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)}

I have also created the interface as follows:

@Component

public interface IMailManager {

added implements:

@Component

@Transactional

public class MailManager extends AbstractManager implements IMailManager {

and changed autowired:

@Autowired

public IMailManager mailManager;

But I am still getting errors as follows

..Could not autowire field: public pl.com.radzikowski.webmail.service.IMailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager...

by (6.9k points)   | 72 views

2 Answers

0 votes

Solution :

After doing lot of research I found the correct way to autowire AbstractManager as follows:

@Autowired
@Qualifier(value="mailService")
public MailManager mailManager;

and

@Component("mailService")
@Transactional
public class MailManager extends AbstractManager {
}
by (36.1k points)  
0 votes

This is a common exception thrown by the BeanFactory when the user tries to resolve a bean that simply is not defined in the spring context.

Here we will discuss some possible reasons;

Found for dependency:

The most common reason for this exception is simply trying to inject a bean that is not defined.

Example:

For example, BeanB is wiring in a collaborator BeanA;

@Component

public class BeanA {

   @Autowired

    private BeanB dependency;

    //...

}

Now if the dependency BeanB is not defined in the Spring Context, then the bootstrap will fail with the no such bean definition.

Is defined:

Another reason for this exception is the existence of the two beans in the context, instead of one.

Example:

If an interface, IBeanB is implemented by two beans BeanB1 and BeanB2.

@Component

public class BeanB1 implements IBeanB {

    //

}

@Component

public class BeanB2 implements IBeanB {

    //

}

If the Bean A auto wires this interface, Spring will not know which one of the two implementations to inject;

@Component

public class BeanA {

    @Autowired

    private IBeanB dependency;

    ...

}

Again will result of same error;

Solution:

The solution of this problem is to use the Qualifier annotation to specify exactly the name of the bean you want;

@Component

public class BeanA {

    @Autowired

    @Qualifier("beanB2")

    private IBeanB dependency;

    ...

}

 

ago by (3.2k points)  
2,245 questions
2,807 answers
60 comments
241 users