Erro Transação CDI JPA JTA

173 views
Skip to first unread message

guilhermefacanha

unread,
Aug 24, 2016, 3:37:25 PM8/24/16
to CEJUG
Olá tenho um projeto utilizando jta-data-source com JBoss EAP.

Por algum motivo ao tentar persitir um objeto estou recebendo o erro

> JBAS011469: Transaction is required to perform this operation (either
> use a transaction or extended persistence context):
> javax.faces.FacesException: #{back.salvar}:
> javax.persistence.TransactionRequiredException: JBAS011469:
> Transaction is required to perform this operation (either use a
> transaction or extended persistence context)

Estou utilizando @Transactional mas ele parece não estar sendo reconhecido, alguém já passou por isso?

```
@Stateless
@Named
public class BaseDao implements Serializable
{
    private static final long serialVersionUID = -8993128837557701804L;

    @PersistenceContext
    protected EntityManager manager;

    @Transactional
    public void persist(Object object)
    {
        manager.persist(object);
    }

}

```

PS: Todos os objetos estão injetados, o manager está injetado com o objeto org.jboss.as.jpa.container.TransactionScopedEntityManager

Euclides Filizola

unread,
Aug 24, 2016, 3:44:32 PM8/24/16
to ce...@googlegroups.com
Qual versão do hibernate ta usando ? Pode está ocorrendo que a versão do hibernate não seja compatível com a versão do jboss. 
Exemplo: Hibernate 4.0.1.Final depende do pacote jboss-transaction-api_1.1_spec e esse por sua vez não tem o @Transactional. Já a versão 1.2 do jboss-transaction tem.

É só uma sugestão.

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.
---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Euclides Filizola

Felipe Rodrigues

unread,
Aug 24, 2016, 3:50:55 PM8/24/16
to ce...@googlegroups.com
Boa tarde, Guilherme.

Você precisa utilizar as duas anotações juntas?

@Stateless
@Named

public class BaseDao implements Serializable
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


Felipe Rodrigues

unread,
Aug 24, 2016, 3:51:45 PM8/24/16
to ce...@googlegroups.com
@Stateless
@Named
public class BaseDao implements Serializable
...

Guilherme Façanha

unread,
Aug 24, 2016, 3:55:35 PM8/24/16
to ce...@googlegroups.com
Não, foram só testes.

Geralmente uso só o @Stateless.

Botei esse como teste.

Mas não fez diferença.

Em 24 de agosto de 2016 16:50, Felipe Rodrigues <feliperod...@gmail.com> escreveu:



--
Att
Guilherme Façanha
(85) 9621-0392 (TIM) / (85) 8716-6346 (OI)
Fortaleza - CE

Marcus Mazzo Laprano

unread,
Aug 24, 2016, 4:03:42 PM8/24/16
to ce...@googlegroups.com
Guilherme

Tenta mudar o @Transactional por @TransactionAttribute e vê se funciona.

Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Em 24 de agosto de 2016 16:50, Felipe Rodrigues <feliperod...@gmail.com> escreveu:

Felipe Rodrigues

unread,
Aug 24, 2016, 4:03:45 PM8/24/16
to ce...@googlegroups.com
1) Mostra a exception completa e a classe que está injetando o BaseDao.
2) Não está acontecendo um erro antes de chamar o persist()?

Guilherme Façanha

unread,
Aug 24, 2016, 4:05:12 PM8/24/16
to ce...@googlegroups.com
Já tentei usando EJB. Usando @TransactionManaged e @TransactionAttribute mesma coisa.


Guilherme Façanha

unread,
Aug 24, 2016, 4:06:11 PM8/24/16
to ce...@googlegroups.com
Quem injeta no BaseDao eh o próprio container JBoss EAP através do @PersistenceContext.

As consultas funcionam normalmente e não dá nenhum erro.

O único erro eh na hora de commitar alguma coisa no banco.

Marcus Mazzo Laprano

unread,
Aug 24, 2016, 4:07:40 PM8/24/16
to ce...@googlegroups.com
Se tirar a anotação da o mesmo erro?

Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Euclides Filizola

unread,
Aug 24, 2016, 4:09:00 PM8/24/16
to ce...@googlegroups.com
Faz o seguinte teste, ao invés de injetar o entityManager via annotation, instancia um factory e depois chama o entity só a título de teste e verifica se funciona.


private EntityManagerFactory factory = Persistence.createEntityManagerFactory("conexaoXXXXX");
private EntityManager entityManager = factory.createEntityManager();





Marcus Mazzo Laprano

unread,
Aug 24, 2016, 4:15:12 PM8/24/16
to ce...@googlegroups.com
Euclides,

Se ele fizer isso ele terá que mudar o tipo de datasource dele. Ele usa JTA, que é responsabilidade do container, ele teria que passar para Resource Local pra conseguir fazer isso. 

Guilherme, vc esta utilizando Spring tambem? Se sim o erro pode ser o import. 

Como esta sendo injetado essa classe BaseDao? Pra que funcione corretamente tem que injetar via @EJB.
Eu trabalho com as mesmas tecnologias, minha classe DAO é um EJB, a classe que chama esse DAO injeta por @EJB e os métodos são anotados com TransactionAttribute(...) visto que em um EJB Stateless o contexto já é transacional e ao sair do método ele commita automaticamente.

Como estão a injeção do teu EJB?



Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Felipe Rodrigues

unread,
Aug 24, 2016, 4:19:41 PM8/24/16
to ce...@googlegroups.com
Mostra as classes que você utiliza até chegar no BaseDAO.persist().

Rafael Ponte

unread,
Aug 24, 2016, 4:28:40 PM8/24/16
to ce...@googlegroups.com
Opa,

A anotação @Transactional é do CDI 1.1, ou seja, você precisa de um contêiner JavaEE 7.

De qualquer forma, basta um @Stateless para que o bean seja transacional por padrão desde o Java EE 6, ou seja, nem mesmo precisaria da anotação @TransactionAttribute.

Tem certeza que está tudo configurado corretamente no servidor? Digo, as conexões e o JTA?

Um abraço,

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Euclides Filizola

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att
Guilherme Façanha
(85) 9621-0392 (TIM) / (85) 8716-6346 (OI)
Fortaleza - CE

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att
Guilherme Façanha
(85) 9621-0392 (TIM) / (85) 8716-6346 (OI)
Fortaleza - CE

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Euclides Filizola

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Marcus Mazzo Laprano

unread,
Aug 24, 2016, 4:32:14 PM8/24/16
to ce...@googlegroups.com
Isso mesmo Ponte. @Stateless já cria um contexto transacional. Se ele quiser anotar com @TransactionAttribute seria para definir qualquer outro tipo de transação (nova, sem transação, etc) visto que por ser Stateless o default seria Required (caso exista transação ele mantem caso não exista ele cria uma nova e utiliza).

Creio que ele possa estar injetando o Dao por @Inject e por isso não cria o contexto. Apenas um chute visto que ele ainda não respondeu a forma que esta injetando o Dao.

Abraços.

Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Euclides Filizola

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att
Guilherme Façanha
(85) 9621-0392 (TIM) / (85) 8716-6346 (OI)
Fortaleza - CE

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att
Guilherme Façanha
(85) 9621-0392 (TIM) / (85) 8716-6346 (OI)
Fortaleza - CE

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Euclides Filizola

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Felipe R. Oliveira.
Analista de Sistemas.
Especialista em Engenharia de Software.


--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

--
-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+unsubscribe@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+unsubscribe@googlegroups.com.

Charles Queiroz

unread,
Aug 24, 2016, 5:04:09 PM8/24/16
to ce...@googlegroups.com
Acho que está tendo algum conflito de gerencia dos bens, vc quer usar EJB ou CDI ? Misturar as duas não é boa coisa… 

Qual a stack trace completa?

Como você está injetando o EntityManager? 

Como está a sua configuração do persistence.xml ? 

Atenciosamente,

Charles Queiroz 


Dazen™ IT Services
Technology - Software Development 

cha...@dazen.com.br

Fortaleza - CE

Phone: +55 85 9933 1585 

Twitter: @CharlesQueiiroz


-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.

Rafael Uchôa

unread,
Aug 24, 2016, 5:15:11 PM8/24/16
to CEJUG
Como isso é o JBoss EAP, alguns detalhes:

1- De qual pacote realmente essa annotation @Transactional está sendo importada ?


OU


2- Lookup para JTA:

Antigamente era necessário configurar o lookup para poder participar da transação dentro de datasources XA ou mensageria com o JMS, devido a transação está dentro do JNDI.

<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" /

https://docs.jboss.org/hibernate/orm/3.3/reference/pt-BR/html/session-configuration.html





Rafael Uchôa
www.naskar.com.br


Guilherme Façanha

unread,
Aug 25, 2016, 8:02:40 AM8/25/16
to ce...@googlegroups.com
Pessoal obrigado pelas resposta, vamos lá:

Já testei apenas com o @Stateless (mesma coisa)

O caminho que faço para testar seguinte: Tenho um ObjectDao extends BaseDao todos injetados com CDI.

Como falei tudo está funcionando, EntityManager está injetado, as selects funcionam normalmente, apenas a transação que está com erro.

A saída de ir para Persistence.createFactory para esse projeto não é viável.

Rafael tentei a propriedade que você indicou (mesma coisa tb).
Substitui a propriedade
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
pela

<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />

Tb usei as duas juntas e nada.

Estou achando que o problema pode ser de conflitos de gerenciamento como citado pelo Charles.

Todos os meus projetos utilizo do jeito que está e nunca tive problema. Apenas esse.

Contexto:
A aplicação é um container que roda uma rota Camel que lê uma fila e salva um registro em uma tabela.
Essa aplicação utiliza outros componentes da solução como um todo pode dependência. (talvez aqui esteja com algum conflito de gerenciamento)

persistence.xml

<persistence-unit name="pu">

        <jta-data-source>java:/jboss/datasources/ds</jta-data-source>
   
        <class>...</class>
               
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
       
        <properties>
            <property name="hibernate.default_schema" value="cevr"/>
           
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            <property name="wildfly.jpa.default-unit" value="true" />
            <property name="hibernate.show_sql" value="false" />
            <property name="hibernate.format_sql" value="false" />

            <property name="hibernate.connection.aggressive_release" value="true" />
            <property name="hibernate.connection.release_mode" value="after_transaction" />
           
        </properties>
    </persistence-unit>
BaseDao

@Stateless

public class BaseDao implements Serializable
{
    private static final long serialVersionUID = -8993128837557701804L;

    @PersistenceContext
    protected EntityManager manager;

    @Transactional
    public void persist(Object object)
    {
        manager.persist(object);
    }

}

ResultadoDao

public class ResultadoDao extends BaseDao implements Serializable
{
    private static final long serialVersionUID = 4793660476585234499L;
 
}


ResultadoPersistenceProcess (Responsável por receber a msg da fila e processar)

public class ResultadoPersistenceProcess implements Processor
{

    @Inject
    private ResultadoDao resultadoDao;

    @Override
    public void process(Exchange exchange) throws Exception
    {
        Resultado res = (Resultado) exchange.getIn().getBody();
        try
        {
            resultadoDao.persist(res);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            throw new Exception("Erro ao persistir os dados da Mensagem => " + entradaFiscalizacao.getId());
        }
    }

}

PS: Está tudo funcionando e injetado via CDI, teste querys de select e meu EntityManager está injetado e funcionando.
Apenas a exception abaixo ocorre quando tento salvar um novo objeto no banco


> JBAS011469: Transaction is required to perform this operation (either
> use a transaction or extended persistence context):
> javax.faces.FacesException: #{back.salvar}:
> javax.persistence.TransactionRequiredException: JBAS011469:
> Transaction is required to perform this operation (either use a
> transaction or extended persistence context)

Marcus Mazzo Laprano

unread,
Aug 25, 2016, 8:14:58 AM8/25/16
to ce...@googlegroups.com
Guilherme,

Uma dúvida. A tua classe ResultadoDao não tem nenhuma anotação. Tipo, ela nem é EJB nem é componente. Isso ta correto?



Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Guilherme Façanha

unread,
Aug 25, 2016, 8:23:55 AM8/25/16
to ce...@googlegroups.com
O CDI que injeta ela.

Marcus Mazzo Laprano

unread,
Aug 25, 2016, 8:25:55 AM8/25/16
to ce...@googlegroups.com
Faz o seguinte então.

Anota a classe com @Stateless e muda a forma de injeção pra @EJB e testa.

O select funciona pq não usa transação. Se vc tentar excluir provavelmente vai dar o mesmo problema.

Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Guilherme Façanha

unread,
Aug 25, 2016, 9:24:39 AM8/25/16
to ce...@googlegroups.com
Marcus,

valeu pela dica, usando o @EJB ao invés do @Inject resolveu o problema.

Só achei estranho pq a especificação do CDI diz que ele injeta EJB quando o objeto for EJB.

Valeu ae.

Abraço a todos pela ajuda.

Ythalo Rossy

unread,
Aug 25, 2016, 9:36:53 AM8/25/16
to ce...@googlegroups.com
Caros,

Baseado na resposta do Marcus é para funcionar apenas anotando o bean com @Stateless.

A anotação @EJB apenas fará com que a busca pelo bean tenha um escopo, vamos dizer, bem menor.


--
Ythalo Rossy Saldanha Lira
Analista de Sistemas Senior / Systems Analyst Senior
Secretária da Fazenda do Estado do Ceará

Marcus Mazzo Laprano

unread,
Aug 25, 2016, 9:56:44 AM8/25/16
to ce...@googlegroups.com
Guilherme, fiz um protótipo somente com CDI pra ver se ajuda também.

Ajusta de acordo com sua necessidade (se preciso for) (Foi bem simples, login e atualização de uma entidade)

@Named
public class LoginDao implements Serializable{
private static final long serialVersionUID = 1L;
@PersistenceContext(name="erp", unitName="erp")
private EntityManager em;
@Transactional(Transactional.TxType.REQUIRES_NEW)
public Usuario login(String user, String pass){
Usuario u = (Usuario) em.createQuery("select u from Usuario u where u.login = :login and u.senha = :senha")
.setParameter("login", user).setParameter("senha", pass).getSingleResult();
if(u != null){
u.setToken("novo"+String.valueOf(Math.random()).substring(0,5));
em.merge(u);
}
return u;
}

}


@Named @ConversationScoped
public class LoginBean implements Serializable{
private static final long serialVersionUID = 1L;

private String user;
private String pass;
private Usuario usuario;
@Inject
private LoginDao dao;

public String login(){
usuario = dao.login(user, pass);
return null;
}

 //GETS e SETS

}



@Entity
public class Usuario implements Serializable{

private static final long serialVersionUID = -9097947509262547610L;
@Id
@SequenceGenerator(sequenceName = "seq_usuario", name = "SEQUSER", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUSER")
private Long id;

@Column(unique = true, nullable = false)
private String login;

@Column(nullable = false)
private String senha;

private String token;

// GETS e SETS

}


Dessa forma eu consigo pegar o contexto (injetando tudo via CDI) e utilizo uma transação no método de login atualizando o campo token com um valor randômico. Não coloquei tratamento de exceção nem nada... apenas para ilustração.

CDI é bem mais leve que EJB, na versão 1.x vc já tem os contextos transacionais. O meu teste foi utilizando Glassfish como container mas creio que não mude para o WF.

Abraços e boa sorte.


Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Marcus Mazzo Laprano

unread,
Aug 25, 2016, 9:59:46 AM8/25/16
to ce...@googlegroups.com
Ahh... tb não segui nenhum padrão de desenvolvimento não... visto que to chamando dao direto de bean... foi so pra exemplificar como ficaria com CDI 1.x (1.1, 1.2) ok?

Marcus Mazzo Laprano
Analista / Desenvolvedor Java
http://www.marcusmazzo.com.br

Guilherme Façanha

unread,
Aug 25, 2016, 3:12:03 PM8/25/16
to ce...@googlegroups.com
Opa Marcus o uso do EJB ja resolveu meu problema como falei anteriormente.

Como esse é um projeto Legado não tenho como ter certeza do porque daquela outra maneira não estava funcionando.

Mas tenho vários projetos desenhados daquele maneira que funcionam normalmente.

Valeu pela ajuda

Charles Queiroz

unread,
Aug 29, 2016, 5:16:36 PM8/29/16
to CEJUG
Como eu falei, conflito de gerenciadores de contexto. Você tendo dois caras gerenciando contexto, vai dar merda..

Ainda bem que resolveu seu problema a tempo. 

Imagine que um súdito não pode atender a dois reis ao mesmo tempo .. hehehe 

Atenciosamente,

Charles Queiroz 


Dazen™ IT Services
Technology - Software Development 

cha...@dazen.com.br

Fortaleza - CE

Phone: +55 85 9933 1585 

Twitter: @CharlesQueiiroz


-- Você está inscrito na lista de discussão técnica do CEJUG. Para sair da lista de discussão, envie um email para cejug+un...@googlegroups.com.

---
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages