7
respostas

WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped

oioi, conseguem ajudar? não consegui testar o assíncrono...

ao tentar recebi o erro abaixo. como o CheckoutBean está @Named tentei adicionar outros tipos de @Scoped e ainda assim não tive sucesso...

13:09:48,670 INFO  [stdout] (default task-13) compra: 5160bfdc-6b6f-493a-89f4-786c05fd3ed3

13:09:50,715 INFO  [stdout] (pool-8-thread-1) response do PagGT pagar(): Pagamento efetuado com sucesso

13:09:50,715 INFO  [stdout] (pool-8-thread-1) compra total: 234.00

13:09:50,722 ERROR [org.jboss.resteasy.resteasy_jaxrs.i18n] (pool-8-thread-1) RESTEASY002010: Failed to execute: javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error
    at br.com.casadocodigo.loja.service.PagamentoService.lambda$0(PagamentoService.java:60)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:689)
    at org.jboss.weld.bean.ContextualInstanceStrategy$DefaultContextualInstanceStrategy.getIfExists(ContextualInstanceStrategy.java:90)
    at org.jboss.weld.bean.ContextualInstance.getIfExists(ContextualInstance.java:63)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:83)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:99)
    at org.jboss.weld.proxies.ServletContext$236329698$Proxy$_$$_WeldClientProxy.getContextPath(Unknown Source)
    at br.com.casadocodigo.loja.service.PagamentoService.lambda$0(PagamentoService.java:53)
    ... 5 more
7 respostas

Oi Aline, fui ver o código do PagamentoService e não vi nenhum bean requestscoped sendo injetado, mas posso estar enganado, é claro.Consegue postar aqui as classes envolvidas nessa exception?

package br.com.casadocodigo.loja.service;

import java.net.URI;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.enterprise.context.ConversationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.transaction.TransactionScoped;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;

import br.com.casadocodigo.loja.daos.CompraDao;
import br.com.casadocodigo.loja.models.Compra;

@Path("/pagamento")
public class PagamentoService {

    @Inject
    private CompraDao compraDao;
    @Inject
    private PagamentoGateway pagamentoGt;
    @Inject
    private ServletContext context;

    // integracoes Assincronas do java7 através de um pool
    private static ExecutorService executor = Executors.newFixedThreadPool(50);

    @POST // recebe via POST //@Suspended informa q é assyncrono
    public void pagar(@Suspended final AsyncResponse ar, @QueryParam("uuid") String arg0) {// @QueryParam param na url
        System.out.println(arg0);

        Compra compra = compraDao.buscaPorUuid(arg0);
        System.out.println("compra: " + compra.getUuid());

        executor.submit(() -> {
            try {
                pagamentoGt.pagar(compra.getTotal());
                System.out.println("compra total: " + compra.getTotal());
                // criando o response:
                URI uriBuilder = UriBuilder
                        .fromPath("http://localhost:8080" + context.getContextPath() + "/index.xhtml")
                        .queryParam("msg", "Compra realizada com sucesso").build();
                System.out.println("imprimindo uriBuilder: " + uriBuilder);
                Response response = Response.seeOther(uriBuilder).build();
                System.out.println("imprimindo response: " + response);
                ar.resume(response);// informando o response
            } catch (Exception e) {
                ar.resume(new WebApplicationException(e));
            }

        });

    }
}
package br.com.casadocodigo.loja.daos;

import java.io.Serializable;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import br.com.casadocodigo.loja.models.Compra;

public class CompraDao implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @PersistenceContext
    private EntityManager em;

    public void salvar(Compra compra) {
        em.persist(compra);
        System.out.println("CompraDAo presist()");

    }

    public Compra buscaPorUuid(String uuid) {
        return em.createQuery("select c from Compra c where uuid = :Uuid", Compra.class)
            .setParameter("Uuid", uuid).getSingleResult();

    }


}
package br.com.casadocodigo.loja.service;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;

import br.com.casadocodigo.loja.models.Pagamento;

public class PagamentoGateway implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public String pagar(BigDecimal total) {
        Client client = ClientBuilder.newClient();//javax.ws
        Pagamento pagamento = new Pagamento(total);
        String target = "http://book-payment.herokuapp.com/payment";
        Entity<Pagamento> json = Entity.json(pagamento);//jax-ws transforma obj pagamento em json para envio
        WebTarget webTarget = client.target(target);//definimos o target e recebemos retorno WebTarget
        Builder request = webTarget.request();
        String response = request.post(json, String.class);//post json e espera como retorno json/String
        System.out.println("response do PagGT pagar(): " + response);
        return response;
    }

}

Bom, se alguém aí for RequestScoped realmente não vai funcionar :(. O executor executa a função passada como argumento em outra thread e o bean vai ter perdido a referência para o request. A solução é desvincular o código do bean do request.

oi, começa no CheckoutBean como @Model. oq seria desvincular do request? já tentei outras formas de Scoped.

package br.com.casadocodigo.loja.beans;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.ConversationScoped;
import javax.enterprise.inject.Model;
import javax.faces.context.FacesContext;
import javax.faces.flow.FlowScoped;
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.TransactionScoped;
import javax.transaction.Transactional;

import br.com.casadocodigo.loja.models.CarrinhoCompras;
import br.com.casadocodigo.loja.models.Compra;
import br.com.casadocodigo.loja.models.Usuario;

@Model
public class CheckoutBean {

    private Usuario usuario = new Usuario();

    @Inject
    private CarrinhoCompras carrinho;

    @Inject
    private FacesContext facesContext;

    @Transactional
    public void finalizar() {

        Compra compra = new Compra();
        compra.setUsuario(usuario);
        carrinho.finalizar(compra);
        //dao.salvar(usuario);

        //chamando outra url pela app sem o faces redirect, pegar o response e enviar para outro local:
        String contextName = facesContext.getExternalContext().getRequestContextPath();
        HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
        response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT);//temporary redirect
        response.setHeader("Location", contextName+"/services/pagamento?uuid="+compra.getUuid());
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }




}

Opa, me desculpa... quando respondi, não tinha visto os outros códigos que você tinha postado. É, o checkoutbean não deveria dar problema ali, ele não participa do resource do jax-rs. Mas alguém ali ta precisando de um request e eu não estou vendo... Qual é a linha 53 da classe PagamentoService? Essa é a linha referenciada na exception... Se preferir, pode colocar o código no github também.

oi bom dia, sim a linha 53 era do contextPath(). Pesquisando vi outro colega dizendo que teve q extrair pra uma var. Tirei de dentro do try e rodou! =D obg!

String contextPath = context.getContextPath();
System.out.println("contextPath: "+contextPath);

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software