gpt4 book ai didi

java - Spring 注入(inject)错误, Spring 对象注入(inject)的对象 setter 错误

转载 作者:行者123 更新时间:2023-12-01 15:01:37 29 4
gpt4 key购买 nike

这与此相关:

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

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

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

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>

我的类(class):

注册操作

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



}

应用程序上下文提供程序

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

实体开始

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

}

插入用户配置文件

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




}

检查记录是否存在

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。我也查过网络,但找不到类似的东西..

非常感谢。

最佳答案

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

但是,即使根据您的代码片段中的内容,我也可以提供一些 Spring 基础知识的清晰说明。 setter 定义的 bean 属性必须与 bean 属性名称匹配。如果没有这个,属性(property)注入(inject)就无法进行。但是,听起来您更改了字段本身的名称以匹配;这将是现场注入(inject)。完全不同的机制。我建议你确实需要理解属性注入(inject)、字段注入(inject)和构造函数注入(inject)的概念,以及 Autowiring 的概念。抱歉,如果我误认为您没有调用此电话;看来你不这么认为。

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

我不确定 spring 是否允许这样做,但如果允许,则必须对注入(inject)如何进行做出一些武断的决定,因为我认为,它根本不可能以正常方式满足循环。

关于java - Spring 注入(inject)错误, Spring 对象注入(inject)的对象 setter 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13562720/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com