【问题标题】:Bean property 'persistenceManagerFactory' is not writable or has an invalid setter methodBean 属性“persistenceManagerFactory”不可写或设置方法无效
【发布时间】:2015-04-19 12:22:12
【问题描述】:

我正在运行 maven jdo 项目。我想使用注释事务,所以我已经根据这个设置了我的调度程序,但是我在错误之后得到了这个错误。

org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'myController': Injection of autowired dependencies 
failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Could not
autowire field: private com.titas.dao.UserDAO 
com.titas.controller.MyController.userDAO; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'userDAO' defined in ServletContext resource [/WEB-
INF/dispatcher-servlet.xml]: Error setting property values; nested 
exception is org.springframework.beans.NotWritablePropertyException: 
Invalid property 'persistenceManagerFactory' of bean class 
[com.titas.dao.UserDAOImpl]: Bean property 'persistenceManagerFactory' 
is not writable or has an invalid setter method. Does the parameter type 
of the setter match the return type of the getter?

我的 dispatcher.xml 是:

<!-- declare mvc to be annotation driven -->
<mvc:annotation-driven/>
<!-- provide Your Base package to scan annotations for components -->
<context:component-scan base-package="com.titas.controller"></context:component-scan>
<mvc:resources location="/resources/" mapping="/resources/**"/>
 <!-- enable the configuration of transactional behavior based on annotations-->
<tx:annotation-driven transaction-manager="txManager"/>


<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

<!--
Most controllers will use the ControllerClassNameHandlerMapping above, but
for the index controller we are using ParameterizableViewController, so we must
define an explicit mapping for it.
-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="index">indexController</prop>
        </props>
    </property>
</bean>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:prefix="/WEB-INF/jsp/"
      p:suffix=".jsp" />

<!--The index controller.-->
<bean name="indexController"
      class="org.springframework.web.servlet.mvc.ParameterizableViewController"
      p:viewName="index" />

<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="com.mysql.jdbc.Driver"
    p:url="jdbc:mysql://localhost:3306/login"
    p:username="root"
    p:password="" />

<!-- PMF Bean -->
<bean id="myPmf" class="org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean">
    <property name="jdoPropertyMap">
            <props>
                <prop key="javax.jdo.PersistenceManagerFactoryClass">org.datanucleus.api.jdo.JDOPersistenceManagerFactory</prop>
                <prop key="javax.jdo.option.ConnectionDriverName">com.mysql.jdbc.Driver</prop>
                <prop key="javax.jdo.option.ConnectionURL">jdbc:mysql://localhost:3306/login</prop>
                <prop key="javax.jdo.option.ConnectionUserName">root</prop>
                <prop key="javax.jdo.option.NontransactionalRead">true</prop>
                <prop key="javax.jdo.option.RetainValues">false</prop>
                <prop key="javax.jdo.option.DetachAllOnCommit">true</prop>
                <prop key="javax.jdo.option.Multithreaded">true</prop>
                <prop key="datanucleus.appengine.ignorableMetaDataBehavior">NONE</prop>
            </props>
    </property>
</bean>

<bean id="pmfProxy" class="org.springframework.orm.jdo.TransactionAwarePersistenceManagerFactoryProxy">
<property name="targetPersistenceManagerFactory" ref="myPmf"/>
<property name="allowCreate" value="false"/>
</bean>   


<bean id="txManager" class="org.springframework.orm.jdo.JdoTransactionManager">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceManagerFactory" ref="pmfProxy"/>
</bean>

<bean id="userDAO" class="com.titas.dao.UserDAOImpl" >
    <property name="persistenceManagerFactory" ref="pmfProxy"/>
</bean>

UserDAOImpl.java

@Repository

公共类 UserDAOImpl 实现 UserDAO{ 静态 Logger log = Logger.getLogger(UserDAOImpl.class.getName());

@Autowired
@Qualifier("dataSource")
private DataSource dataSource; 
@Autowired
@Qualifier("myPmf")
private PersistenceManagerFactory persistenceManagerFactory;

HttpServletRequest request;


@Override
@Transactional
public User getUser(String user_name, String user_password) {
    PersistenceManager pm = this.persistenceManagerFactory.getPersistenceManager();
    try {
        User user=new User();
        pm.makePersistent(user);
        Query query = pm.newQuery(User.class, "this.userName == userNameParam && this.userPassword==userPasswordParam");
        query.setFilter("this.userName == userNameParam && this.userPassword==userPasswordParam");
        query.declareParameters("String lastNameParam, String userPasswordParam");
        log.info("hereeee 5");
        log.info("hereeee again 5");
        user = (User)query.execute(user_name,user_password);
        log.info("hereeee 6");
        log.info("hereeee again 6");
        log.info(user.getUserEmail()+"..........."+user.getUserProfileName());
        return user;
    }
    finally {
        pm.close();
    } 
 }

MyController.java

@Controller
//@RequestMapping(value = "/test")
public class MyController{

  static Logger log = Logger.getLogger(MyController.class.getName());
  @Autowired
  private UserDAO userDAO;
  List<User> allUser = new ArrayList<User>();

我可以知道我需要改变的地方吗? 提前致谢。

【问题讨论】:

  • 该消息明确抱怨 UserDAO 类及其设置器存在问题。然而你没有发布代码......叹息。
  • 你是如何定义 UserDAOImpl 的?
  • 用 userdaoimpl 类和 mycontroller 类更新了我的问题

标签: spring transactions annotations jdo


【解决方案1】:

你的 bean 定义是:

<bean id="userDAO" class="com.titas.dao.UserDAOImpl" >
    <property name="persistenceManagerFactory" ref="pmfProxy"/>
</bean>

在您的 UserDaoImpl 中,您还没有定义 Spring 抱怨的名为 setPersistenceManagerFactory 的方法。

通过上面的 bean 定义,Spring 将通过 setter 方法在用户 dao 中注入工厂对象,该方法不存在,因此您会看到异常。

所以而不是:

@Qualifier("myPmf")

您应该为代理工厂对象使用 bean 名称(虽然我没有看到使用 myPmf 的问题,但这正是您尝试在 userDao bean 中使用 &lt;property name="persistenceManagerFactory" ref="pmfProxy"/&gt; 注入属性的原因,因此此建议您可以忽略),例如:

@Qualifier("pmfProxy")

并删除当您说自动装配时尝试注入属性的行:

<bean id="userDAO" class="com.titas.dao.UserDAOImpl" />

来自 userDAO 的 bean 定义,因为 Spring 将为您注入它。

如果您想手动指定依赖项并通过 setter 注入它,那么您需要定义 setter 方法,例如:

 .. setPersistenceManagerFactory(..) {
       ....
 }

【讨论】:

  • 感谢您的回复,但 org.springframework.transaction.CannotCreateTransactionException:无法打开 JDO PersistenceManager 进行交易;嵌套异常是 java.lang.IllegalStateException: No JDO PersistenceManager bound to thread,并且配置不允许在这里创建非事务性的-----现在发生这种情况
  • org.springframework.transaction.CannotCreateTransactionException:无法为事务打开 JDO PersistenceManager;嵌套异常是 java.lang.IllegalStateException: No JDO PersistenceManager bound to thread,并且配置不允许在这里创建非事务性的
  • this 帖子。
  • 我已经读过这个了。但对我来说很困惑。你能给我提示吗?
猜你喜欢
  • 2013-01-31
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2018-09-26
  • 2015-09-07
  • 1970-01-01
相关资源
最近更新 更多