0

This is in relation to this:

Suddenly my spring.xml won't instantiate my classes and Error Exception occurs

I changed my spring XML to applicationContext.xml as advice. I did not use the getbeans() to instantiate beans from factory. Instead I used the object injection using the said xml.

However I have a problem. There is an error:

SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'recordexistuserprofile' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'registeraction' while setting bean property 'registeraction'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'registeraction' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'insertUserProfile' while setting bean property 'insertUserProfile'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'insertUserProfile' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'registeraction' of bean class [lotmovement.business.crud.InsertUserProfile]: Bean property 'registeraction' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4701)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5204)
    at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5199)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'registeraction' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean 'insertUserProfile' while setting bean property 'insertUserProfile'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'insertUserProfile' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'registeraction' of bean class [lotmovement.business.crud.InsertUserProfile]: Bean property 'registeraction' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
    ... 26 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'insertUserProfile' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'registeraction' of bean class [lotmovement.business.crud.InsertUserProfile]: Bean property 'registeraction' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1279)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
    ... 39 more
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'registeraction' of bean class [lotmovement.business.crud.InsertUserProfile]: Bean property 'registeraction' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:801)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:651)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:78)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1276)

That is weird since I automatically add the setter through netbeans. There should be no error.

Here is my applicationContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <bean id="userprofile"  class="lotmovement.business.entity.UserProfile">

    </bean>

    <bean id="entitystart"  
          class="lotmovement.business.crud.EntityStart">

    </bean>

    <bean id="recordexistuserprofile"  
          class="lotmovement.business.crud.RecordExistUserProfile">
        <property name="registeraction" ref="registeraction"/>
        <property name="entitystart" ref="entitystart"/>

    </bean>


    <bean id="insertUserProfile" class="lotmovement.business.crud.InsertUserProfile">
        <property name="registeraction" ref="registeraction"/>
        <property name="entitystart" ref="entitystart"/>
        <property name="userprofile" ref="userprofile"/>

    </bean>

    <bean id="registeraction"  class="lotmovement.action.RegisterAction">
        <property name="insertUserProfile" ref="insertUserProfile"/>
        <property name="entitystart" ref="entitystart"/>
        <property name="recordexistuserprofile" ref="recordexistuserprofile"/>
    </bean>  


</beans>

Web.XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>register.jsp</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


</web-app>

My Classes:

RegisterAction

       /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lotmovement.action;

import com.opensymphony.xwork2.ActionSupport;
import lotmovement.business.crud.ApplicationContextProvider;
import lotmovement.business.crud.EntityStart;
import lotmovement.business.crud.InsertUserProfile;
import lotmovement.business.crud.RecordExistUserProfile;
import lotmovement.business.entity.UserProfile;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class RegisterAction extends ActionSupport {

    private static String userId;
    private static String password;
    private static String firstName;
    private static String lastName;
    private static int securityLevel;

    EntityStart es;
    InsertUserProfile iup;
    RecordExistUserProfile reup;


    ApplicationContextProvider acp = new ApplicationContextProvider();

    ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();


    @Override
    public void validate() {
        if (reup.checkrecordexist()) {
            addActionError("record already exist.");
        }
    }

    @Override
    public String execute() {



      iup.Insert();


        return SUCCESS;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getSecurityLevel() {
        return securityLevel;
    }

    public void setSecurityLevel(int securityLevel) {
        this.securityLevel = securityLevel;
    }
    private String retypepassword;

    public String getRetypepassword() {
        return retypepassword;
    }

    public void setRetypepassword(String retypepassword) {
        this.retypepassword = retypepassword;
    }



    // * Object setter.


    public void setEs(EntityStart es) {
        this.es = es;
    }


    public void setIup(InsertUserProfile iup) {
        this.iup = iup;
    }



    public void setReup(RecordExistUserProfile reup) {
        this.reup = reup;
    }



}

ApplicationContextProvider

package lotmovement.business.crud;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ApplicationContextProvider implements ApplicationContextAware{
 private static ApplicationContext ctx = null;
 public static ApplicationContext getApplicationContext() {
return ctx;
 }
 public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
 }
}

EntityStart

package lotmovement.business.crud;

import lotmovement.business.CRUDxxxx.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import lotmovement.business.entity.UserProfile;

public class EntityStart {
     EntityManagerFactory factory;
     EntityManager em;



    public void StartDbaseConnection()
    {

        factory = Persistence.createEntityManagerFactory("LotMovementPU");
        em = factory.createEntityManager();

    }

    public void StartPopulateTransaction(Object entity){

        EntityTransaction userTransaction = em.getTransaction();

        userTransaction.begin();

        em.persist(entity);
        userTransaction.commit();
        em.close();


    }

    public void CloseDbaseConnection(){
         factory.close();
    }

}

InsertUserProfile

package lotmovement.business.crud;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import lotmovement.business.entity.UserProfile;
import lotmovement.action.LoginAction;
import lotmovement.action.RegisterAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class InsertUserProfile {

     ApplicationContextProvider acp = new ApplicationContextProvider();

    ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();

    UserProfile up;
    RegisterAction ra;
    EntityStart es;

    public void Insert() {


        up.setUserId(ra.getUserId());
        up.setFirstName(ra.getFirstName());
        up.setLastName(ra.getLastName());
        up.setPassword(ra.getPassword());
        up.setSecurityLevel(ra.getSecurityLevel());

        es.StartPopulateTransaction(up);

        es.CloseDbaseConnection();

    }

    public void Update() {
    }

    public void Delete() {
    }







    public void setUp(UserProfile up) {
        this.up = up;
    }


    public void setRa(RegisterAction ra) {
        this.ra = ra;
    }


    public void setEs(EntityStart es) {
        this.es = es;
    }




}

Checkrecordexist

package lotmovement.business.crud;

import lotmovement.action.RegisterAction;
import lotmovement.business.entity.UserProfile;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class RecordExistUserProfile {

    RegisterAction ra;
    EntityStart es;
    ApplicationContextProvider acp = new ApplicationContextProvider();
    ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();

    public boolean checkrecordexist() {

        UserProfile up = es.em.find(UserProfile.class, ra.getUserId());

        if (ra.getUserId().equals(up.getUserId())) {
            return true;
        } else {
            return false;
        }
    }


    public void setRa(RegisterAction ra) {
        this.ra = ra;
    }

    public void setEs(EntityStart es) {
        this.es = es;
    }
}

What I did in netbeans was that I just added the spring libraries on my classpath. These are struts 2.3.4, springframework 2.5.6 SEC03 and SpringFramework 3.1.1. I also have check the net but I could not find something witch similarly the same..

Thank you very much.

Community
  • 1
  • 1
toksis
  • 139
  • 1
  • 4
  • 14

2 Answers2

1

First of all, I would suggest that you explore the Struts 2 Spring integration instead of trying to integrate spring into struts 2 yourself. The integration is provided by the Strut 2 Spring plugin. You should check it out; it allows you to easily inject beans into your struts 2 actions, not to mention all other objects created by the framework. Here's a link.

But, even based upon what you have in your code snippets, I can provide some clarity on a couple of Spring fundamentals. The bean property as defined by the setter must match the bean property name. Without this, property injection wouldn't work. However, it sounds like you changed the name of the field itself to match; this would be field injection. Completely different mechanisms. I suggest that you really need to understand the concepts of property injection, field injection and constructor injection, as well as the concept of auto-wiring. Sorry, if I'm misassuming that you don't have this stuff dialed; seems like you don't though.

HOWEVER, I suggest you have a bigger problem though. There is a dependency cycle in your beans. Consider these two:

  <bean id="insertUserProfile" class="lotmovement.business.crud.InsertUserProfile">
        <property name="registeraction" ref="registeraction"/>
        <property name="entitystart" ref="entitystart"/>
        <property name="userprofile" ref="userprofile"/>

    </bean>

    <bean id="registeraction"  class="lotmovement.action.RegisterAction">
        <property name="insertUserProfile" ref="insertUserProfile"/>
        <property name="entitystart" ref="entitystart"/>
        <property name="recordexistuserprofile" ref="recordexistuserprofile"/>
    </bean>  

I don't know for sure whether spring allows this, but if it did it would have to make some arbitrary decision about how the injections go down as it's simply not possible satisfy a cycle in a normal fashion, I think.

chad
  • 7,369
  • 6
  • 37
  • 56
  • I had read some basic injections in the net.. As what I understand, for me to instantiate those classes, i needed to place it on the property. The classes on the property is needed to be instantiated from the bean id class. Any suggestions about my problem? Of course I will do my part. I will read more about spring :) thanks – toksis Nov 26 '12 at 19:38
  • Yes, I'm suggesting that you have a cycle in your dependencies. By this I mean that your bean "insertUserProfile" depends upon the "registeraction" bean and vice versa. How is spring supposed to inject an "insertUserProfile" bean into the "registeraction" bean when instantiating the registeraction bean requires that the insertUserProfile bean is already created itself? – chad Nov 26 '12 at 20:08
  • @toksis how are these answers not providing what you need? – chad Nov 26 '12 at 21:03
  • It do provide what I need. What do you mean? is there a botton here to say that? I could not vote up because I only have 5 reputation. – toksis Nov 26 '12 at 22:52
0

Add the appropriate getters/setters for these classes. I have omitted other code for brevity. I think it is complaining because you do not have a get method defined, it may also not like that the field name and bean name do not correlate.

InsertUserProfile

public class InsertUserProfile {

    RegisterAction registerAction;

    public void setRegisterAction(String registerAction){
      this.registerAction = registerAction;
    }

    public RegisterAction getRegisterAction(){
      return this.registerAction;
    }
}

RecordExistUserProfile

public class RecordExistUserProfile {
        RegisterAction registerAction;

        public void setRegisterAction(String registerAction){
          this.registerAction = registerAction;
        }

        public RegisterAction getRegisterAction(){
          return this.registerAction;
        }
}
Kevin Bowersox
  • 93,289
  • 19
  • 159
  • 189
  • Do you mean that the bean name and the field name must be the same? with the small and big letters? – toksis Nov 26 '12 at 10:38
  • I do not believe the names need to be the same, I believe Spring attempts to match the beans by type. – Kevin Bowersox Nov 26 '12 at 10:45
  • I had change the value of the bean property name to the variable of the object data. like for InsertUserProfile iup; the property name = iup. ref="InsertUserProfile"; And now after compile it runs. Howerver there is an error on this code and currently checking why this happend. java.lang.NullPointerException lotmovement.action.RegisterAction.validate(RegisterAction.java:43) if (reup.checkrecordexist()) { addActionError("record already exist."); } – toksis Nov 26 '12 at 11:07
  • It seems that the beans are not instantiated by the factory? – toksis Nov 26 '12 at 11:26