Não aparece ordenação nem filtro de dados nas colunas do DataTable - JSF

Pessoal estou criando um projeto que possui nas páginas DataTable com as informações para facilitar a visualização e gostaria de usar o sortBy e o filterBy porém já coloquei o parâmetro nas colunas mas não aparece. Se alguém puder ajudar fico muito agradecido.

FornecedoresBean

package br.com.farmacia.bean;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.farmacia.DAO.FornecedoresDAO;
import br.com.farmacia.domain.Fornecedores;
import br.com.farmacia.util.JSFUtil;

@ManagedBean(name = "MBFornecedores")
@ViewScoped
public class FornecedoresBean {

	private Fornecedores fornecedores;
	private ArrayList<Fornecedores> itens;
	private ArrayList<Fornecedores> itensFiltrados;

	public Fornecedores getFornecedores() {
		return fornecedores;
	}

	public void setFornecedores(Fornecedores fornecedores) {
		this.fornecedores = fornecedores;
	}

	public ArrayList<Fornecedores> getItens() {
		return itens;
	}

	public void setItens(ArrayList<Fornecedores> itens) {
		this.itens = itens;
	}

	public ArrayList<Fornecedores> getItensFiltrados() {
		return itensFiltrados;
	}

	public void setItensFiltrados(ArrayList<Fornecedores> itensFiltrados) {
		this.itensFiltrados = itensFiltrados;
	}

	@PostConstruct
	public void prepararPesquisa() {

		try {
			FornecedoresDAO fDAO = new FornecedoresDAO();
			itens = fDAO.listar();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void prepararNovo() {

		fornecedores = new Fornecedores();
	}

	public void novo() {

		try {
			FornecedoresDAO fDAO = new FornecedoresDAO();
			fDAO.salvar(fornecedores);
			itens = fDAO.listar();

			JSFUtil.adicionarMensagemSucesso("Fornecedor salvo com sucesso.");
		} catch (SQLException e) {
			JSFUtil.adicionarMensagemErro("e.getMessage()");
			e.printStackTrace();
		}
	}

	public void excluir() {
		try {
			FornecedoresDAO fDAO = new FornecedoresDAO();
			fDAO.excluir(fornecedores);
			itens = fDAO.listar();
			
			JSFUtil.adicionarMensagemSucesso("Fornecedor excluido com sucesso.");
		} catch (SQLException e) {
			JSFUtil.adicionarMensagemErro("Não é possível excluir um fornecedor com produtos associados.");
			e.printStackTrace();
		}
	}

	public void editar() {
		try {
			FornecedoresDAO fDAO = new FornecedoresDAO();
			fDAO.editar(fornecedores);
			itens = fDAO.listar();

			JSFUtil.adicionarMensagemSucesso("Fornecedor editado com sucesso.");
		} catch (SQLException e) {
			JSFUtil.adicionarMensagemErro("e.getMessage()");
			e.printStackTrace();
		}
	}
}

FornecedoresDAO

package br.com.farmacia.DAO;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import br.com.farmacia.domain.Fornecedores;
import br.com.farmacia.factory.ConexaoFactory;

public class FornecedoresDAO {

	public void salvar(Fornecedores f) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append("INSERT INTO fornecedores ");
		sql.append("(descricao) ");
		sql.append("VALUES (?)");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		comando.setString(1, f.getDescricao());
		comando.executeUpdate();

	}

	public void excluir(Fornecedores f) throws SQLException {

		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM fornecedores ");
		sql.append("WHERE codigo = ? ");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		comando.setLong(1, f.getCodigo());
		comando.executeUpdate();
	}

	public void editar(Fornecedores f) throws SQLException {

		StringBuilder sql = new StringBuilder();
		sql.append("UPDATE fornecedores ");
		sql.append("SET descricao = ? ");
		sql.append("WHERE codigo = ? ");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());
		comando.setString(1, f.getDescricao());
		comando.setLong(2, f.getCodigo());
		comando.executeUpdate();
	}

	public Fornecedores buscaPorCodigo(Fornecedores f) throws SQLException {

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT codigo, descricao ");
		sql.append("FROM fornecedores ");
		sql.append("WHERE codigo = ? ");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());

		comando.setLong(1, f.getCodigo());
		ResultSet resultado = comando.executeQuery();
		Fornecedores retorno = null;

		if (resultado.next()) {
			retorno = new Fornecedores();
			retorno.setCodigo(resultado.getLong("codigo"));
			retorno.setDescricao(resultado.getString("descricao"));
		}

		return retorno;
	}

	public ArrayList<Fornecedores> buscarPorDescricao(Fornecedores f) throws SQLException {

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT codigo, descricao ");
		sql.append("FROM fornecedores ");
		sql.append("WHERE descricao LIKE ? ");
		sql.append("ORDER BY descricao ASC ");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());

		comando.setString(1, "%" + f.getDescricao() + "%");

		ResultSet resultado = comando.executeQuery();

		ArrayList<Fornecedores> lista = new ArrayList<Fornecedores>();

		while (resultado.next()) {

			Fornecedores item = new Fornecedores();
			item.setCodigo(resultado.getLong("codigo"));
			item.setDescricao(resultado.getString("descricao"));

			lista.add(item);

		}

		return lista;
	}

	public ArrayList<Fornecedores> listar() throws SQLException {

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT codigo, descricao ");
		sql.append("FROM fornecedores ");
		sql.append("ORDER BY descricao ASC ");

		Connection conexao = ConexaoFactory.conectar();

		PreparedStatement comando = conexao.prepareStatement(sql.toString());

		ResultSet resultado = comando.executeQuery();

		ArrayList<Fornecedores> lista = new ArrayList<Fornecedores>();

		while (resultado.next()) {

			Fornecedores f = new Fornecedores();
			f.setCodigo(resultado.getLong("codigo"));
			f.setDescricao(resultado.getString("descricao"));

			lista.add(f);

		}

		return lista;
	}

	/*
	 * public static void main(String[] args) {
	 * 
	 * Fornecedores f1 = new Fornecedores();
	 * f1.setDescricao("MICROOFFICE INFORMÁTICA"); Fornecedores f2 = new
	 * Fornecedores(); f2.setDescricao("NAGEM");
	 * 
	 * FornecedoresDAO fDAO = new FornecedoresDAO();
	 * 
	 * try { fDAO.salvar(f1);
	 * 
	 * fDAO.salvar(f2); System.out.println("Salvo com sucesso!"); } catch
	 * (SQLException e) { System.out.println("Erro ao salvar!");
	 * e.printStackTrace(); }
	 * 
	 * /* Fornecedores f1 = new Fornecedores(); f1.setCodigo((long) 1);
	 * 
	 * FornecedoresDAO fDAO = new FornecedoresDAO(); try { fDAO.excluir(f1);
	 * System.out.println("Deletado com sucesso!"); } catch (SQLException e) {
	 * System.out.println("Erro ao deletar!"); e.printStackTrace(); }
	 * 
	 * 
	 * /* Fornecedores f1 = new Fornecedores();
	 * 
	 * f1.setCodigo((long) 1); f1.setDescricao("HUGO VASCONCELOS");
	 * 
	 * FornecedoresDAO fDAO = new FornecedoresDAO(); try { fDAO.editar(f1);
	 * System.out.println("Editado com sucesso!"); } catch (SQLException e) {
	 * System.out.println("Erro ao editar!"); e.printStackTrace(); }
	 */

	/*
	 * Fornecedores f1 = new Fornecedores(); f1.setCodigo((long) 1);
	 * 
	 * Fornecedores f2 = new Fornecedores(); f2.setCodigo((long) 3);
	 * 
	 * FornecedoresDAO fDAO = new FornecedoresDAO();
	 * 
	 * try {
	 * 
	 * Fornecedores f3 = fDAO.buscaPorCodigo(f1); Fornecedores f4 =
	 * fDAO.buscaPorCodigo(f2); System.out.println("Resultado 1: " + f3);
	 * System.out.println("Resultado 2: " + f4); } catch (SQLException e) {
	 * System.out.println("Erro ao buscar!"); e.printStackTrace(); }
	 */

	/*
	 * FornecedoresDAO fDAO = new FornecedoresDAO();
	 * 
	 * try {
	 * 
	 * ArrayList<Fornecedores> lista = fDAO.listar();
	 * 
	 * for (Fornecedores f : lista) { System.out.println("Resultado " + f); }
	 * 
	 * } catch (SQLException e) { System.out.println("Erro ao buscar!");
	 * e.printStackTrace(); }
	 * 
	 */

	/*
	 * Fornecedores f1 = new Fornecedores(); f1.setDescricao("de");
	 * 
	 * FornecedoresDAO fDAO = new FornecedoresDAO();
	 * 
	 * try {
	 * 
	 * ArrayList<Fornecedores> lista = fDAO.buscarPorDescricao(f1);
	 * 
	 * for (Fornecedores f : lista) { System.out.println("Resultado " + f); }
	 * 
	 * } catch (Exception e) { System.out.println("Erro ao buscar");
	 * e.printStackTrace(); }
	 */

}

Fornecedores

package br.com.farmacia.domain;

public class Fornecedores {

	private Long codigo;
	private String descricao;
	
	public Long getCodigo() {
		return codigo;
	}
	public void setCodigo(Long codigo) {
		this.codigo = codigo;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	@Override
	public String toString() {
		String saida = codigo + " - " + descricao;
		return saida;
	}
}
`

fornecedores.xhtml

`<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/modeloSistema.xhtml"
>

<ui:define name="menu">
<ui:include src="/includes/menu.xhtml" />
</ui:define>

<ui:define name="conteudo">

<h:form id="frmfornecedores">

<p:dataTable id="tbfornecedores" 
widgetVar="tabelaFornecedores"
emptyMessage="Nenhum registro encontrado!"
value="#{MBFornecedores.itens}"
var="item"
filteredValue="#{MBFornecedores.itensFiltrados}" paginator="true"
rows="7"
>

<f:facet name="header">Lista de Fornecedores</f:facet>

    <p:column headerText="Código" sortBy="#{item.codigo}" filterBy="#{item.codigo}">
      <h:outputText value="#{item.codigo}" />
    </p:column>
 
    <p:column sortBy="#{item.descricao}" filterBy="#{item.descricao}" headerText="Descrição" >
        <h:outputText value="#{item.descricao}" />
    </p:column>
    
    <p:column headerText="Opções">
        <p:commandButton icon="ui-icon-trash"   
   oncomplete="PF('dlgforExcluir').show();" update=":frmforExcluir:pnforExcluir" >
    <f:setPropertyActionListener value="#{item}" target="#{MBFornecedores.fornecedores}"></f:setPropertyActionListener>
    </p:commandButton>
    
      <p:commandButton icon="ui-icon-pencil"  
   oncomplete="PF('dlgforEditar').show();" update=":frmforEditar:pnforEditar" >
    <f:setPropertyActionListener value="#{item}" target="#{MBFornecedores.fornecedores}"></f:setPropertyActionListener>
    </p:commandButton>
    </p:column>
    
   <f:facet name="footer">
   <p:commandButton value="Novo" actionListener="#{MBFornecedores.prepararNovo}" 
   oncomplete="PF('dlgforNovo').show();" update=":frmforNovo:pnforNovo" /></f:facet>
   
</p:dataTable>
</h:form>

<p:dialog widgetVar="dlgforNovo" closable="false" draggable="false" resizable="false"
header="Cadastar Fornecedor"
modal="true"
appendTo="@(body)"
>
<h:form id="frmforNovo">
<h:panelGrid id="pnforNovo" columns="2">
<p:outputLabel value="Descrição:" for="txtDescNovo" />
<h:inputText size="30" maxlength="50" id="txtDescNovo"
value="#{MBFornecedores.fornecedores.descricao}" required="true"
requiredMessage="O campo descrição é obrigatório." />
</h:panelGrid>
<h:panelGrid columns="2">
<p:commandButton value="Gravar" actionListener="#{MBFornecedores.novo}" 
oncomplete="verificar(xhr, status, args, 'dlgforNovo', 'tbfornecedores');" 
update=":frmfornecedores:tbfornecedores :msgGlobal"/>
<p:commandButton value="Cancelar" 
process="@this"
onclick="PF('dlgforNovo').hide();" />
</h:panelGrid>
</h:form>
</p:dialog>

<p:dialog widgetVar="dlgforExcluir" closable="false" draggable="false" resizable="false"
header="Excluir Fornecedor"
modal="true"
appendTo="@(body)">

<h:form id="frmforExcluir">
<h:panelGrid id="pnforExcluir" columns="2">
<h:outputText value="Código" />
<h:outputText value="#{MBFornecedores.fornecedores.codigo}" />

<h:outputText value="Descrição" />
<h:outputText value="#{MBFornecedores.fornecedores.descricao}" />
</h:panelGrid>

<h:panelGrid columns="2">
<p:commandButton value="Excluir" actionListener="#{MBFornecedores.excluir}" 
oncomplete="PF('dlgforExcluir').hide(); PF('tabelaFornecedores').clearFilters(); " 
update=":frmfornecedores:tbfornecedores :msgGlobal"/>
<p:commandButton value="Cancelar" onclick="PF('dlgforExcluir').hide();" />
</h:panelGrid>

</h:form>

</p:dialog>



<p:dialog widgetVar="dlgforEditar" closable="false" draggable="false" resizable="false"
header="Editar Fornecedor"
modal="true"
appendTo="@(body)">

<h:form id="frmforEditar">
<h:panelGrid id="pnforEditar" columns="2">
<h:outputText value="Código" />
<h:outputText value="#{MBFornecedores.fornecedores.codigo}" />

<h:outputText value="Descrição" for="txtEdtfor" />
<h:inputText value="#{MBFornecedores.fornecedores.descricao}" 
 id="txtEdtfor"
required="true"
requiredMessage="O campo descrição é obrigatório." />
</h:panelGrid>

<h:panelGrid columns="2">
<p:commandButton value="Editar" actionListener="#{MBFornecedores.editar}" 
oncomplete="verificar(xhr, status, args, 'dlgforEditar', 'tbfornecedores'); " 
update=":frmfornecedores:tbfornecedores :msgGlobal"/>
<p:commandButton value="Cancelar"
process="@this"
 onclick="PF('dlgforEditar').hide();" />
</h:panelGrid>

</h:form>

</p:dialog>

</ui:define>

</ui:composition>`