Classe chamar metodo de controller VRAPTOR [Resolvido]

3 respostas
quintanilhasi

Bom dia a todos!

Eu tenho um classe que implementa o Task e nela preciso chamar um método do controller do vraptor. Como eu faria isso?

Classe que implementa o task
@ApplicationScoped  
@Scheduled(cron = "0 15 10 ? * *")
public class VerificaAgenda implements Task{	

	public void execute() {
		
	}

}
Método do controller
public void verifica_tempo_chamado(){
    	List<Cliente> listaCliente = clientedao.listaTudo();
    			
    	for(Cliente cliente : listaCliente){
    		if(chamadodao.qtde_dias_ultimo_chamado(cliente.getId()) > 30){
    			Chamado chamado = new Chamado();
    			chamado.setCliente(cliente);
    			chamado.setData_abertura(new Date());
    			chamado.setDescricao_inicial("CLIENTE NAO ENTRA EM CONTATO POR MAIS DE 30 DIAS!");
    			chamado.setTipo_problema("MLPonto");
    			chamado.setStatus_tempo("NORMAL");
    			chamado.setStatus_prioridade("NORMAL");
    			chamado.setUsuario_abriu(usuariodao.load("clientepadrao"));
    	        chamado.setDepartamento("SUPORTE");
    	        chamadodao.salva(chamado);
    		}
    		
    	}
    }

desde já agradeço.

3 Respostas

B

Quintanilhasi, nesse seu caso específico não terá como, pois sua Task VerificaAgenda tem escopo ApplicationScoped, e os @Resources são RequestScoped. Você pode extrair essa lógica para outra classe, também ApplicationScoped, e chamá-la tanto na Task quanto no Controller:

@Componet
@ApplicationScoped
public class VerificadorDeTempoDeChamado {


    // Recebe o ClienteDao como parâmetro do método, porque provavelmente ele é @ResquestScoped
    public void verifica(ClienteDao clientes) {
        List<Cliente> listaCliente = clientedao.listaTudo();  
                  
        for(Cliente cliente : listaCliente) {  
            if(chamadodao.qtde_dias_ultimo_chamado(cliente.getId()) > 30) {  
                Chamado chamado = new Chamado();  
                chamado.setCliente(cliente);  
                chamado.setData_abertura(new Date());  
                chamado.setDescricao_inicial("CLIENTE NAO ENTRA EM CONTATO POR MAIS DE 30 DIAS!");  
                chamado.setTipo_problema("MLPonto");  
                chamado.setStatus_tempo("NORMAL");  
                chamado.setStatus_prioridade("NORMAL");  
                chamado.setUsuario_abriu(usuariodao.load("clientepadrao"));  
                chamado.setDepartamento("SUPORTE");  
                chamadodao.salva(chamado);  
            }  
        }
    }

}

@ApplicationScoped    
@Scheduled(cron = "0 15 10 ? * *")  
public class VerificaAgenda implements Task{
    
    // Vai ter que receber o container pra poder pegar o ClienteDao que é @RequestScoped
    private Container container;
    private VerificadorDeTempoDeChamado verificador;

    public VerificaAgenda(Container container, VerificadorDeTempoDeChamado verificador) {
        this.container = container;
        this.verificador = verificador;
    }

    public void execute() {  
        ClienteDao clientes = container.instanceFor(ClienteDao.class);
        verificador.verifica(clientes);
    }  
  
} 

@Resource
public class SeuController {

    private ClienteDao clientes;
    private VerificadorDeTempoDeChamado verificador;

    public SeuController(ClienteDao clientes, VerificadorDeTempoDeChamado verificador) {
        this.clientes = clientes;
        this.verificador = verificador;
    }


    public void verificaTempoDeChamado() {
        verificador.verifica(clientes);
    }

}
quintanilhasi

bob_sponja obrigado pela ajuda!

G

Boas,

esse codigo funcionou?
Sempre que tendo obter um component requestScoped na task usando o container obtenho NullPointerException

Criado 30 de julho de 2013
Ultima resposta 23 de jan. de 2014
Respostas 3
Participantes 3