JSF - EJB- JPA - CDI - Injeção de dep. no managed bean gera exceção TransactionRequiredException

Caros colegas,

Estou tentando tornar meu managed bean um EJB. Para isso injetei o EntityManager no managed bean. As opções para consulta e listagem funcionaram, entretanto, nas demais operações como em.persist(corrente) ou em.merge(corrente) retorna uma exceção do tipo TransactionRequiredException.

Vocêm podem dar uma olhada no código. Não consegui achar o erro. Postei o código abaixo.

Obrigado.

package mBean;   
  
import bean.Departamento;   
import util.JsfUtil;   
import util.PaginationHelper;   
import java.util.List;   
import java.util.ResourceBundle;   
import javax.ejb.Stateless;   
import javax.faces.bean.ManagedBean;   
import javax.faces.bean.SessionScoped;   
import javax.faces.model.DataModel;   
import javax.faces.model.ListDataModel;   
import javax.inject.Inject;   
import javax.inject.Named;   
import javax.persistence.EntityManager;   
import javax.persistence.PersistenceContext;   
import javax.persistence.Query;   
import javax.persistence.criteria.CriteriaQuery;   
import javax.persistence.criteria.Root;   
  
@Stateless   
@Named   
@ManagedBean(name = "departamentoMBean")   
@SessionScoped   
public class DepartamentoMBean {   
    @PersistenceContext(unitName = "Exemplo001PU")   
    @Inject   
    EntityManager em;   
    private Departamento corrente;   
    private DataModel itens = null;   
    private DataModel itensSelecionados = null;   
    private PaginationHelper pagination;   
    private int indiceItemSelecionado;   
  
    public DepartamentoMBean() {   
    }   
  
    public EntityManager getEntityManager() {   
        return em;   
    }   
  
    public Departamento getSelecionado() {   
        if (corrente == null) {   
            corrente = new Departamento();   
            indiceItemSelecionado = -1;   
        }   
        return corrente;   
    }   
  
    public String salvar() {   
        try {   
            em.persist(corrente);   
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/propriedades.recursos.propriedades").getString("departamentoCriado"));   
            corrente = new Departamento();   
            indiceItemSelecionado = -1;   
            return "Criar";   
        } catch (Exception e) {   
            System.out.println(e.getMessage());   
            String m = e.getMessage();   
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/propriedades.recursos.propriedades").getString("erroPersistenciaOcorrido"));   
            return null;   
        }   
    }   
  
    public String atualizar() {   
        try {   
            em.merge(corrente);   
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/propriedades.recursos.propriedades").getString("departamentoAtualizado"));   
            return "Ver";   
        } catch (Exception e) {   
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/propriedades.recursos.propriedades").getString("erroPersistenciaOcorrido"));   
            return null;   
        }   
    }   
  
    public PaginationHelper getPaginacao() {   
        if (pagination == null) {   
            pagination = new PaginationHelper(10) {   
                @Override   
                public int getContarItens() {   
                    CriteriaQuery cq = em.getCriteriaBuilder().createQuery();   
                    Root rt = cq.from(Departamento.class);   
                    cq.select(em.getCriteriaBuilder().count(rt));   
                    Query q = em.createQuery(cq);   
                    return ((Long) q.getSingleResult()).intValue();   
                }   
  
                @Override   
                public DataModel criarPageDataModel() {   
                    int vetor[] = new int[]{getPrimeiroItemPagina(), getPrimeiroItemPagina() + getTamanhoPagina()};   
                    CriteriaQuery cq = em.getCriteriaBuilder().createQuery();   
                    cq.select(cq.from(Departamento.class));   
                    Query q = em.createQuery(cq);   
                    q.setMaxResults(vetor[1] - vetor[0]);   
                    q.setFirstResult(vetor[0]);   
                    List lista = q.getResultList();   
  
                    ListDataModel lstDataModel = new ListDataModel(lista);   
                    return lstDataModel;   
                }   
            };   
        }   
        return pagination;   
    }   
  
    public DataModel getItens() {   
        if (itens == null) {   
            itens = getPaginacao().criarPageDataModel();   
        }   
        return itens;   
    }   
  
    public String proximo() {   
        getPaginacao().proximaPagina();   
        itens = null;   
        return "Listar";   
    }   
  
    public String anterior() {   
        getPaginacao().paginaAnterior();   
        itens = null;   
        return "Listar";   
    }   
  
    public String ver() {   
        corrente = (Departamento) getItens().getRowData();   
        indiceItemSelecionado = pagination.getPrimeiroItemPagina() + getItens().getRowIndex();   
        return "Ver";   
    }   
  
    public String entrarConsulta() {   
        corrente = new Departamento();   
        indiceItemSelecionado = -1;   
        return "Consultar";   
    }   
  
    public String consultar() {   
        itensSelecionados = null;   
        return "ListarSelecionados";   
    }   
  
    public DataModel getItensSelecionados() {   
        if (itensSelecionados == null) {   
            Query query = em.createNamedQuery("Departamento.findByParteNomDep");   
            query.setParameter("nomDep", "%" + corrente.getNomDep() + "%");   
            List lista = query.getResultList();   
            itensSelecionados = new ListDataModel(lista);   
        }   
        return itensSelecionados;   
    }   
  
    public String editar() {   
        corrente = (Departamento) getItens().getRowData();   
        indiceItemSelecionado = pagination.getPrimeiroItemPagina() + getItens().getRowIndex();   
        return "Editar";   
    }   
  
    public String remover() {   
        corrente = (Departamento) getItens().getRowData();   
        indiceItemSelecionado = pagination.getPrimeiroItemPagina() + getItens().getRowIndex();   
        acaoExcluir();   
        itens = null;   
        return "Listar";   
    }   
  
    public String criar() {   
        corrente = new Departamento();   
        indiceItemSelecionado = -1;   
        return "Criar";   
    }   
  
    public String listar() {   
        itens = null;   
        return "Listar";   
    }   
  
    public String excluirVer() {   
        acaoExcluir();   
        itens = null;   
        return "Listar";   
  
    }   
  
    private void acaoExcluir() {   
        try {   
            em.remove(em.merge(corrente));   
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/propriedades.recursos.propriedades").getString("departamentoDeletedado"));   
        } catch (Exception e) {   
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/propriedades.recursos.propriedades").getString("erroPersistenciaOcorrido"));   
        }   
    }   
  
    public List getItensDisponiveis() {   
        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();   
        cq.select(cq.from(Departamento.class));   
        return em.createQuery(cq).getResultList();   
    }   
}