I am using Spring MVC Portlet and I have a problem. My app is working properly while it have one bean. If I want to add another bean below error is occurring.
Error log is here;
ERROR [org.springframework.web.portlet.DispatcherPortlet] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'addSinifController': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.project.service.SinifService com.project.controller.AddSinifController.sinifService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySinifService' defined in file [/tmp/1-sample_BookCatalog/WEB-INF/classes/com/project/service/SinifService.class]: Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:280)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1011)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:543)
at
...
My application-context.xml ;
<context:annotation-config/>
<context:component-scan base-package="sample.code.listing" />
<context:component-scan base-package="com.project.controller" />
<context:component-scan base-package="com.project.domain" />
<context:component-scan base-package="com.project.service" />
<bean
class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean
class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="propertyEditorRegistrars">
<list>
<ref bean="myPropertyEditorRegistrar" />
</list>
</property>
</bean>
</property>
</bean>
<bean id="myPropertyEditorRegistrar" class="sample.code.listing.utils.MyPropertyEditorRegistrar"/>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>content.Language-ext</value>
</list>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
My AddSinifController is here :
@Controller(value="addSinifController")
@RequestMapping(value="VIEW")
@SessionAttributes(types=Sinif.class)
public class AddSinifController {
@Autowired
@Qualifier("mySinifService")
private SinifService sinifService;
public SinifService getSinifService() {
return sinifService;
}
public void setSinifService(SinifService sinifService) {
this.sinifService = sinifService;
}
private Logger logger = Logger.getLogger(AddSinifController.class);
@RenderMapping(params = "myaction=addsinif")
public String showAddSinifForm(RenderResponse response,ModelMap model){
return "addSinifForm";
}
@RenderMapping(params = "myaction=home")
public String showhome(RenderResponse response,ModelMap model) {
return "home";
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Long.class, new LongNumberEditor());
}
@ModelAttribute("sinif")
public Sinif getCommandObject(){
return new Sinif("sinif");
}
@ModelAttribute(value = "myaction=siniflar")
public List<Sinif> getCommandObject2(){
return sinifService.getSiniflar();
}
@ActionMapping(params="myaction=addSinif")
public void addSinif(@ModelAttribute Sinif sinif,
BindingResult bindingResult, ActionResponse response,
SessionStatus sessionStatus){
Kademe kademe = new Kademe("kademe");
kademe.setId((long) 6);
sinif.setKademe(kademe);
}
sinifService.addSinif(sinif);
response.setRenderParameter("myaction", "addsinif");
sessionStatus.setComplete();
if(!bindingResult.hasErrors()){
System.out.println("hata yok");
sinifService.addSinif(sinif);
response.setRenderParameter("myaction", "addsinif");
sessionStatus.setComplete();
}else{
response.setRenderParameter("myaction", "home");
}
}
}
Regards
Give the same annotation
to the class implementing your SinifService interface, which you want to instantiate. Basically, the problem here is that when you ask Spring to autowire SinifService interface in the AddSinifController class, Spring doesnt know which implementation of the interface to be instantiated, when you have more than one class implementing your interface. By giving the @Qualifier annotation, you are referring to that particular bean which you want to be instantiated.