用于弹簧对象注入的错误对象设置器的弹簧注入错误

时间:2012-11-26 10:18:21

标签: java spring struts2

这与此有关:

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

我将spring XML更改为applicationContext.xml作为建议。我没有使用getbeans()来从工厂实例化bean。相反,我使用所述xml使用对象注入。

但是我有问题。有一个错误:

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)

这很奇怪,因为我通过netbeans自动添加setter。应该没有错误。

这是我的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>

我的课程:

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;
    }
}

我在netbeans中做的是我刚在类路径中添加了spring库。这些是struts 2.3.4,springframework 2.5.6 SEC03和SpringFramework 3.1.1。我也检查了网,但我找不到同样的东西......

非常感谢。

2 个答案:

答案 0 :(得分:1)

首先,我建议您探索Struts 2 Spring集成,而不是尝试将spring集成到struts 2中。这种集成由Strut 2 Spring插件提供。你应该检查一下;它允许您轻松地将bean注入struts 2操作,更不用说框架创建的所有其他对象。 Here's a link

但是,即使基于您在代码片段中的内容,我也可以提供一些关于Spring基础知识的清晰度。 setter定义的bean属性必须与bean属性名称匹配。没有这个,财产注入将无法运作。但是,听起来你改变了字段本身的名称来匹配;这将是现场注入。完全不同的机制。我建议你真的需要理解属性注入,场注入和构造函数注入的概念,以及自动布线的概念。对不起,如果我误认为你没有拨打这个东西;看起来你不喜欢。

但是,我建议你有更大的问题。您的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>  

我不确定春天是否允许这样做,但是如果确实如此,它必须做出一些关于注射如何下降的任意决定,因为它根本不可能以正常方式满足一个周期,我想。

答案 1 :(得分:0)

为这些类添加适当的getter / setter。为简洁起见,我省略了其他代码。我认为这是抱怨,因为你没有定义get方法,也可能不喜欢字段名和bean名称不相关。

<强> 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;
        }
}