Property not readable on type java.lang.String when using JSF PrimeFaces

10,978

The model class, in this case Car has to be public.

Share:
10,978
mvg
Author by

mvg

Passionate Java programmer, interested in Big Data applications.

Updated on June 08, 2022

Comments

  • mvg
    mvg almost 2 years

    I am trying to implement lazy loading data in data table using the demo code in the site

    PrimeFaces Lazy loading

    and I am getting the error

    javax.el.PropertyNotFoundException: /table.xhtml @14,49 value="#{car.year}": Property 'year' not readable on type java.lang.String
    

    Here is my table.xhtml code

    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    
        <h:form id="form">  
    
    <p:dataTable var="car" value="#{tableBean.lazyModel}" paginator="true" rows="10"  
                  id="carTable" lazy="true">  
    
        <p:column headerText="Year" sortBy="year" filterBy="#{car.year}">  
            <h:outputText value="#{car.year}" />  
        </p:column>  
    
        <p:column headerText="Color" sortBy="color" filterBy="#{car.color}">  
            <h:outputText value="#{car.color}" />  
        </p:column>  
    </p:dataTable>      
    

    TableBean code

    @ManagedBean
    public class TableBean {  
    
    private LazyDataModel<Car> lazyModel;  
    
    private List<Car> cars;
    
    public TableBean() {
        System.out.println("Girish");
        cars = populateRandomCars(50);
        lazyModel = new LazyCarDataModel(cars);
        lazyModel.setRowCount(10);
    }
    
    public LazyDataModel<Car> getLazyModel() {
        return lazyModel;
    }
    
    public void setLazyModel(LazyDataModel<Car> lazyModel) {
        this.lazyModel = lazyModel;
    }
    
    public List<Car> getCars() {
        return cars;
    }
    
    public void setCars(List<Car> cars) {
        this.cars = cars;
    }
    
    private List<Car> populateRandomCars( int size) {
        List<Car> list = new ArrayList<Car>();
        Car car = null;
        for(int i = 0 ; i < size ; i++) {
            car = new Car();
            car.setColor("color "+i);
            car.setYear(""+i);
            list.add(car);  
        }
    
        return list;
    }  
    } 
    

    Car code

    class Car {
    private String year;
    private String color;
    
    
    
    public String getYear() {
        return year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    }
    

    and LazyCarDataModel code

    public class LazyCarDataModel extends LazyDataModel<Car> {  
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private List<Car> datasource;  
    
    public LazyCarDataModel(List<Car> datasource) {  
        this.datasource = datasource;  
    }  
    
    @Override  
    public Car getRowData(String rowKey) {  
    
        return new Car();  
    }  
    
    @Override  
    public Object getRowKey(Car car) {  
        return car.getYear();  
    }  
    
    @Override  
    public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {  
        List<Car> data = new ArrayList<Car>();  
    
        //filter  
        for(Car car : datasource) {  
            boolean match = true;  
    
            for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {  
                try {  
                    String filterProperty = it.next();  
                    String filterValue = filters.get(filterProperty);  
                    String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car));  
    
                    if(filterValue == null || fieldValue.startsWith(filterValue)) {  
                        match = true;  
                    }  
                    else {  
                        match = false;  
                        break;  
                    }  
                } catch(Exception e) {  
                    match = false;  
                }   
            }  
    
            if(match) {  
                data.add(car);  
            }  
        }  
    
    
        //rowCount  
        int dataSize = data.size();  
        this.setRowCount(dataSize);  
    
        //paginate  
        if(dataSize > pageSize) {  
            try {  
                return data.subList(first, first + pageSize);  
            }  
            catch(IndexOutOfBoundsException e) {  
                return data.subList(first, first + (dataSize % pageSize));  
            }  
        }  
        else {  
            return data;  
        }  
    }  
    } 
    

    Please help.

    Thanks in advance.

  • moldovean
    moldovean over 7 years
    I was having a similar problem with tabledata tag. thanks
  • Ross Llewallyn
    Ross Llewallyn over 6 years
    This was the solution to my problem, and something that could be easily overlooked if you're going over getters, setters, and the syntax in the view.