Мое 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>
С помощью этого простого кода страница выглядит следующим образом:
управляемый компонент
@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):