h: dataTable отображает правильное число, но пустые строки - PullRequest
2 голосов
/ 23 сентября 2019

Мое JSF-приложение ведет себя странно, и я прошу коллег помочь мне найти решение.

Приложение извлекает данные из базы данных с помощью классов Facade + DAO, и с помощью отладки и печати я могу утверждать, чтоколлекция объектов правильная (в приведенном ниже примере коллекция содержит 5 объектов и их атрибуты), однако при передаче этой коллекции на страницу Primefaces dataTable не отображает атрибуты, становится ясно, что количество строк является правильнымно атрибуты не отображаются, как показано на рисунке.

Я исследовал другие посты, но описанные ошибки не похожи на мои:

после фильтрации Пустые строки, пустые строки, отображаемые во время подкачкив таблице данных с использованием Primefaces

штрих-код данных показывает пустые строки.Отображение того же количества строк, что и записей в резервном списке

Поскольку управляемый компонент правильно переносит коллекцию, я решил, что проблема должна отображаться (т.е. на странице JSF), и попробоватьчтобы найти причину ошибки, я создал страницу, не используя Primefaces или Facelets, просто компоненты JSF, но ошибка не исчезла.Основной код выглядит следующим образом:

Вот фрагменты кода:

  • простая страница

    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html">
    
    <h:head>
        <link href="scripts/teste.css" rel="stylesheet" type="text/css" media="all" />
    </h:head>
    <h:body>
        <h:form>    
            <h:dataTable value="#{coletaMB.coletas}" var="coleta"
                styleClass="order-table"
                headerClass="order-table-header"
                rowClasses="order-table-odd-row,order-table-even-row">
               <h:column>
                    <f:facet name="header">Nr. Setor</f:facet>
                        <h:outputText value="#{coleta.setor.numero}"/>
                               ---- #{coleta.setor.numero} ----
               </h:column>
           </h:dataTable>       
       </h:form>
    

С помощью этого простого кода страница выглядит следующим образом:

simple JSF page

  • управляемый компонент

    @ManagedBean(name="coletaMB")
    @SessionScoped
    public class ColetaMB{
        @ManagedProperty(name="coleta", value="#{coleta}")
        private Coleta coleta;
        @ManagedProperty(name="coletaFacade", value="#{coletaFacade}")
        private ColetaFacade coletaFacade;
        private List<Coleta> coletas;
    
    
        public List<Coleta> getColetas(){
            if(coletas == null){
                coletas = getListColetas();
            }
            return coletas;
        }
    
        private List<Coleta> getListColetas(){
            coletas = new ArrayList<Coleta>();
            try {
                coletas =  coletaFacade.getColetas();
                return coletas;
            } catch (DAOException e) {
                (...)
            }
        }
        (...)
    }
    
  • Coleta.java

    public class Coleta {
        private int ano;
        private Setor setor;
        private int mes;
        private int semana;
        private int numeroEntrevista;
    
        (*)getters and setter
    }
    
  • Setor.java

    public class Setor {
        private Agencia agencia;
        private String numero;
        private String upa;
    
        (*)getters and setters
    }
    
  • Agencia.java

    public class Agencia {
        private int idAgencia;
        private String nome;
    
        (*)getters and setters
    }
    
  • Фасад

    public List<Coleta> getColetas() throws DAOException {
        return dao.getColetas();
    }
    
  • DAO

    @Value("#{queries.sql01}")
    private String sql01;
    
    public List<Coleta> getColetas() throws DAOException {
        try{
            RowMapper<Coleta> mapper = getRowMapper();
            return getJdbcTemplate().query(sql01, mapper);
        } catch (DataAccessException de) {
            de.printStackTrace();
            throw new DAOException(de.getMessage());
        }
    }
    
    private RowMapper<Coleta> getRowMapper() {
        return new RowMapper<Coleta>() {
            public Coleta mapRow(ResultSet rs, int rowNum) throws SQLException {
                Agencia ag = new Agencia();
                ag.setIdAgencia(rs.getInt(1));
                ag.setNome(rs.getString(2));
    
                Setor s = new Setor();
                s.setAgencia(ag);
                s.setUpa(rs.getString(3));
                s.setNumero(rs.getString(4));
    
                Coleta c = new Coleta();
                c.setSetor(s);
                c.setAno(rs.getInt(5));
                c.setMes(rs.getInt(6));
                c.setSemana(rs.getInt(7));
                c.setNumeroEntrevista(rs.getInt(8));
    
                return c;
            }
        };
    }
    

In getListColetas,Я вставил println, чтобы проверить коллекцию, и она завершена, то есть каждый объект 'coleta' имеет объект 'setor', а каждый 'setor' имеет объект 'agencia'.Но, следуя предложению использовать 'empty' на странице JSF,

<h:outputText value="#{empty coleta} - #{empty coleta.setor} - #{empty coleta.setor.numero}"/>

возврат составил false - true - true, и я не знаю почему.

Мое полное приложение используетследующие библиотеки и зависимости (Spring используется только для классов DI и DAO):

build path

1 Ответ

0 голосов
/ 25 сентября 2019

Решено: в теге dataTable, я изменил атрибут var="coleta" на var="c", например:

<h:dataTable value="#{coletaMB.coletas}" var="c"
        styleClass="order-table"
        headerClass="order-table-header"
        rowClasses="order-table-odd-row,order-table-even-row">
       <h:column>
            <f:facet name="header">Nr. Setor</f:facet>
                <h:outputText value="#{c.setor.numero}"/>
                       ---- #{c.setor.numero} ----
       </h:column>
</h:dataTable>   

Я думаю, что JSF конфликтовал с @ManagedProperty 'coleta 'в ColetaMB, хотя я понимаю, что атрибут var специфичен для различных объектов коллекции, доставляемых в dataTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...