Saptarshi
Saptarshi

Reputation: 148

Bean property 'sakilaDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

I am writing a Spring Program which is working fine with MVC Architecture. But showing the below error after basic spring implementation.

Error creating bean with name 'manager' defined in class path resource [applicationContext.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'SakilaDao' of bean class [com.java.Training.managerImpl.SakilaManagerImpl]: Bean property 'SakilaDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="dao" class="com.java.Training.DaoImpl.SakilaDaoImpl">
    </bean>


    <bean id="manager" class="com.java.Training.managerImpl.SakilaManagerImpl">
        <property name="SakilaDao" ref="dao"></property>
    </bean>

</beans> 

SakilaAction.java

package com.java.Training.action;

import java.util.ArrayList;
import java.util.HashMap;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.google.gson.Gson;
import com.java.Training.manager.SakilaManager;
import com.java.Training.managerImpl.SakilaManagerImpl;
import com.java.Training.model.SakilaPojo;

public class SakilaAction {
    
    // PARAMETERS
    private String start;
    private String limit;
    private String sort;
    private String filter;
    
    // RETURN VALUE
    private String result;
    
    // SakilaManager manager= new SakilaManagerImpl();
    private HashMap <String, Object> dataMap= new HashMap <String, Object>();
    
    
    
    public String getData() {
        
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        SakilaManager manager = (SakilaManager) context.getBean("manager");
        
        try {
                
            ArrayList <SakilaPojo> jArray= (ArrayList<SakilaPojo>) manager.getData(Integer.parseInt(start), Integer.parseInt(limit), filter, sort);
            Integer count= manager.getCount(Integer.parseInt(start), Integer.parseInt(limit), filter);
            
            dataMap.put("Data", jArray);
            dataMap.put("Total", count);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        
        Gson gson = new Gson();
        setResult(gson.toJson(dataMap));
        return "success";
    }
    
    
    
    public String getStart() {
        return start;
    }
    public void setStart(String start) {
        this.start = start;
    }
    public String getLimit() {
        return limit;
    }
    public void setLimit(String limit) {
        this.limit = limit;
    }
    public String getSort() {
        return sort;
    }
    public void setSort(String sort) {
        this.sort = sort;
    }
    public String getFilter() {
        return filter;
    }
    public void setFilter(String filter) {
        this.filter = filter;
    }
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
    
    
}

SakilaManagerImpl.java

package com.java.Training.managerImpl;

import java.util.List;

import com.java.Training.Dao.SakilaDao;
import com.java.Training.DaoImpl.SakilaDaoImpl;
import com.java.Training.manager.SakilaManager;
import com.java.Training.model.SakilaPojo;

public class SakilaManagerImpl implements SakilaManager{
    
    SakilaDaoImpl dao;
    // = new SakilaDaoImpl();
    
    public List<SakilaPojo> getData(Integer start, Integer limit, String filter, String sort) {
        return dao.getData(start, limit, filter, sort);
    }
    public int getCount(Integer start, Integer limit, String filter) {
        return dao.getCount(start, limit, filter);
    }
    
    public SakilaDaoImpl getDao() {
        return dao;
    }
    public void setDao(SakilaDaoImpl dao) {
        this.dao = dao;
    }
}

SakilaManager.java

package com.java.Training.manager;

import java.util.List;

import com.java.Training.model.SakilaPojo;

public interface SakilaManager {
    
    public List<SakilaPojo> getData(Integer start, Integer limit, String filter, String sort);
    public int getCount(Integer start, Integer limit, String filter);
}

In SakilaManagerImpl.java I've tried using SakilaDao dao; in place of SakilaDaoImpl dao; which is the Interface of SakilaDaoImpl class. But same it's throwing the same error.

Upvotes: 0

Views: 2705

Answers (1)

Fakhreddine
Fakhreddine

Reputation: 56

the property name in the xml must match the field name in SakilaManagerImpl

 <bean id="manager" class="com.java.Training.managerImpl.SakilaManagerImpl">
        <property name="dao" ref="dao"></property>
    </bean>

Upvotes: 2

Related Questions