VRAPTOR + JPA HTTP Status 500 - java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

3 respostas
java
J

Olá, estou usando o vraptor com jpa, e toda vez que eu insiro algum elemento e em seguida tento pesquisar (Na maioria das minhas classes) ele da erro quando eu faço uma busca. Eu imaginava que era a cache por isso eu fiz de tudo para ignora-la, no entanto não é. Aqui está o erro e o dao e o pesistence.xml
DAO:
Persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
            http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
        <persistence-unit name="default">
            <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <class>br.com.jamalxvi.modelo.Estado</class>
            <class>br.com.jamalxvi.modelo.Cidade</class>
            <class>br.com.jamalxvi.modelo.Funcionario</class>
            <class>br.com.jamalxvi.modelo.FotoPerfil</class>
            <class>br.com.jamalxvi.modelo.Cliente</class>
            <class>br.com.jamalxvi.modelo.TelefoneCliente</class>
            <class>br.com.jamalxvi.modelo.Fornecedor</class>
            <class>br.com.jamalxvi.modelo.Identificacao</class>
            <class>br.com.jamalxvi.modelo.IdentificacaoVeiculo</class>
            <class>br.com.jamalxvi.modelo.TelefoneFornecedor</class>
            <class>br.com.jamalxvi.modelo.Solicitacoes</class>
            <class>br.com.jamalxvi.modelo.ServicosFeitos</class>
            <class>br.com.jamalxvi.modelo.ServicosExecutados</class>
            <class>br.com.jamalxvi.modelo.Servicos</class>
            <class>br.com.jamalxvi.modelo.PecasUsadas</class>
            <class>br.com.jamalxvi.modelo.Pecas</class>
            <class>br.com.jamalxvi.modelo.Orcamento</class>
            <class>br.com.jamalxvi.modelo.Modelo</class>
            <class>br.com.jamalxvi.modelo.Marca</class>
            <class>br.com.jamalxvi.modelo.Fotos_Solicitacoes</class>
            <properties>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/XXXXXX" />
                <property name="javax.persistence.jdbc.user" value="XXXXXXXX" />
                <property name="javax.persistence.jdbc.password" value="XXXXXXXX" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
                <property name="hibernate.hbm2ddl.auto" value="update"/>
                <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.format_sql" value="true"/>
                <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
                <property name="eclipselink.query-results-cache" value="false"/>
                <property name="eclipselink.cache.shared.default" value="false"/>
				<property name="eclipselink.cache.size.default" value="0"/>
				<property name="eclipselink.cache.type.default" value="None"/>
            </properties>
        </persistence-unit>
    </persistence>

DAO:

package br.com.jamalxvi.dao;

import java.util.Collection;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import org.hibernate.CacheMode;
import org.hibernate.annotations.QueryHints;

import br.com.jamalxvi.modelo.Cliente;
import br.com.jamalxvi.modelo.FotoPerfil;
import br.com.jamalxvi.modelo.Identificacao;
import br.com.jamalxvi.modelo.IdentificacaoVeiculo;
import br.com.jamalxvi.modelo.TelefoneCliente;
@RequestScoped
public class ClienteDAO {
	
	private EntityManager manager;
	public ClienteDAO()
	{
		this(null);
	}
	@Inject
	public ClienteDAO(EntityManager manager){
		this.manager = manager;
	}
	
	public void salvar(Cliente cliente, byte[] imagem_perfil, List<TelefoneCliente> telefones )
	{
		manager.getTransaction().begin();
		cliente.setAtivo(true);
		cliente.getIdentificacao().setCliente(cliente);
		manager.persist(cliente);
		for (TelefoneCliente telefone : telefones) {
			telefone.setCliente(cliente);
			telefone.setAtivo(true);
			manager.persist(telefone);
		}
		if (imagem_perfil != null) {

			FotoPerfil perfil = new FotoPerfil();
			perfil.setAtivo(true);
			perfil.setCliente(cliente);
			perfil.setImg(imagem_perfil);
			manager.persist(perfil);
		}
		manager.getTransaction().commit();
		manager.refresh(cliente);
	}
	public int ultimo()
	{
		TypedQuery<Cliente> query = manager.createQuery("Select c from Cliente c order by "
				+ "c.id DESC", Cliente.class).setHint(QueryHints.CACHE_MODE, CacheMode.IGNORE);
		Cliente c = (Cliente)query.getResultList().get(0);
		return c.getId();
	}
	public void atualizar(Cliente cliente, byte[] imagem_perfil, List<TelefoneCliente> telefones )
	{
		manager.getTransaction().begin();
		cliente.setAtivo(true);
		cliente.getIdentificacao().setCliente(cliente);
		manager.merge(cliente);
		for (TelefoneCliente telefone : telefones) {
			telefone.setCliente(cliente);
			telefone.setAtivo(true);
			manager.merge(telefone);
		}
		if (imagem_perfil != null) {

			FotoPerfil perfil = new FotoPerfil();
			perfil.setAtivo(true);
			perfil.setCliente(cliente);
			perfil.setImg(imagem_perfil);
			manager.merge(perfil);
		}
		
		manager.getTransaction().commit();
		manager.refresh(cliente);
		
	}
	public Collection<Identificacao> idenficacoes()
	{
		TypedQuery<Identificacao> query = manager.createQuery("select i from Identificacao i ",
				Identificacao.class).setHint(QueryHints.CACHE_MODE, CacheMode.IGNORE);
		Collection<Identificacao> lista = query.getResultList();
		
		return lista;
	}
	public Cliente pesquisar_id(int id)
	{
		TypedQuery<Cliente> query = manager.createQuery("Select c from Cliente c where c.id = :pId",
				Cliente.class).setHint(QueryHints.CACHE_MODE, CacheMode.IGNORE);
		query.setParameter("pId", id);
		Cliente cliente = query.getResultList().get(0);
		return cliente;
	}
	public void apagar_telefones(int id)
	{
		Cliente cliente = pesquisar_id(id);
		List<TelefoneCliente> telefoneCliente = cliente.getTelefones();
		manager.getTransaction().begin();
			for (TelefoneCliente tel : telefoneCliente) {
				tel.setAtivo(false);
				manager.merge(tel);
			}
		manager.getTransaction().commit();
		
	}
	public Collection<Cliente> pesquisar_nome(String pesquisa)
	{
		if (pesquisa == null) {
			pesquisa = "";
		}
		TypedQuery<Cliente> query = manager.createQuery("select c from Cliente c where c.ativo ="
				+ " true and c.nome LIKE :pPesquisa", Cliente.class).setHint(QueryHints.CACHE_MODE, CacheMode.IGNORE);
		query.setParameter("pPesquisa", "%"+pesquisa+"%");
		Collection<Cliente> list = query.getResultList();
		
		return list;
		
	}
	public Collection<Cliente> listar()
	{
		TypedQuery<Cliente> query = manager.createQuery("select c from Cliente"
				+ " c where c.ativo = true", Cliente.class).setHint(QueryHints.CACHE_MODE, CacheMode.IGNORE);
		Collection<Cliente> list = query.getResultList();
		
		return list;
		
	}
	public void apagar_imagens(int id)
	{
		Cliente cliente = pesquisar_id(id);
		List<FotoPerfil> fotos = cliente.getFotos();
		manager.getTransaction().begin();
			for (FotoPerfil foto : fotos) {
				foto.setAtivo(false);
				manager.merge(foto);
			}
		manager.getTransaction().commit();
		
	}
	public void apagar(int id)
	{
		manager.getTransaction().begin();
		TypedQuery<Cliente> query = manager.createQuery("Select c from Cliente c where c.id = :pId",
				Cliente.class).setHint(QueryHints.CACHE_MODE, CacheMode.IGNORE);
		query.setParameter("pId", id);
		Cliente cliente = query.getResultList().get(0);
		cliente.setAtivo(false);
		for (IdentificacaoVeiculo veiculo : cliente.getVeiculos()) {
			veiculo.setAtivo(false);
		}
		manager.getTransaction().commit();
		manager.refresh(cliente);
	}
}

ERRO:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	java.util.ArrayList.rangeCheck(Unknown Source)
	java.util.ArrayList.get(Unknown Source)
	br.com.jamalxvi.dao.ClienteDAO.pesquisar_id(ClienteDAO.java:98)
	br.com.jamalxvi.dao.ClienteDAO$Proxy$_$$_WeldClientProxy.pesquisar_id(Unknown Source)
	br.com.jamalxvi.controller.ClienteController.finalizado(ClienteController.java:248)
	br.com.jamalxvi.controller.ClienteController$Proxy$_$$_WeldClientProxy.finalizado(Unknown Source)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	br.com.caelum.vraptor.observer.ExecuteMethod.execute(ExecuteMethod.java:87)
	sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
	org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266)
	org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
	org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)
	org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
	org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165)
	org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119)
	org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112)
	org.jboss.weld.event.EventImpl.fire(EventImpl.java:83)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:78)
	br.com.caelum.vraptor.core.DefaultInterceptorStack$Proxy$_$$_WeldClientProxy.next(Unknown Source)
	br.com.caelum.vraptor.interceptor.DefaultSimpleInterceptorStack.next(DefaultSimpleInterceptorStack.java:49)
	br.com.caelum.vraptor.interceptor.DefaultSimpleInterceptorStack$Proxy$_$$_WeldClientProxy.next(Unknown Source)
	br.com.jamalxvi.seguranca.NomeInterceptor.intercept(NomeInterceptor.java:30)
	br.com.jamalxvi.seguranca.NomeInterceptor$Proxy$_$$_WeldClientProxy.intercept(Unknown Source)
	sun.reflect.GeneratedMethodAccessor72.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	br.com.caelum.vraptor.interceptor.StepInvoker.invokeMethod(StepInvoker.java:49)
	br.com.caelum.vraptor.interceptor.StepInvoker.tryToInvoke(StepInvoker.java:40)
	br.com.caelum.vraptor.interceptor.StepInvoker$Proxy$_$$_WeldClientProxy.tryToInvoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.InterceptorExecutor.executeAround(InterceptorExecutor.java:75)
	br.com.caelum.vraptor.interceptor.InterceptorExecutor$Proxy$_$$_WeldClientProxy.executeAround(Unknown Source)
	br.com.caelum.vraptor.interceptor.AspectStyleInterceptorHandler.execute(AspectStyleInterceptorHandler.java:85)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:98)
	br.com.caelum.vraptor.interceptor.FlashInterceptor$Proxy$_$$_WeldClientProxy.intercept(Unknown Source)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:58)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83)
	br.com.caelum.vraptor.core.DefaultInterceptorStack$Proxy$_$$_WeldClientProxy.next(Unknown Source)
	br.com.caelum.vraptor.interceptor.DefaultSimpleInterceptorStack.next(DefaultSimpleInterceptorStack.java:49)
	br.com.caelum.vraptor.interceptor.DefaultSimpleInterceptorStack$Proxy$_$$_WeldClientProxy.next(Unknown Source)
	br.com.jamalxvi.seguranca.AutorizacaoInterceptor.intercept(AutorizacaoInterceptor.java:37)
	br.com.jamalxvi.seguranca.AutorizacaoInterceptor$Proxy$_$$_WeldClientProxy.intercept(Unknown Source)
	sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	br.com.caelum.vraptor.interceptor.StepInvoker.invokeMethod(StepInvoker.java:49)
	br.com.caelum.vraptor.interceptor.StepInvoker.tryToInvoke(StepInvoker.java:40)
	br.com.caelum.vraptor.interceptor.StepInvoker$Proxy$_$$_WeldClientProxy.tryToInvoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.InterceptorExecutor.executeAround(InterceptorExecutor.java:75)
	br.com.caelum.vraptor.interceptor.InterceptorExecutor$Proxy$_$$_WeldClientProxy.executeAround(Unknown Source)
	br.com.caelum.vraptor.interceptor.AspectStyleInterceptorHandler.execute(AspectStyleInterceptorHandler.java:85)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:75)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor$Proxy$_$$_WeldClientProxy.intercept(Unknown Source)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:58)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:83)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.start(DefaultInterceptorStack.java:93)
	br.com.caelum.vraptor.core.DefaultInterceptorStack$Proxy$_$$_WeldClientProxy.start(Unknown Source)
	br.com.caelum.vraptor.observer.RequestHandlerObserver.handle(RequestHandlerObserver.java:93)
	sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:93)
	org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:266)
	org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:253)
	org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:232)
	org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:169)
	org.jboss.weld.event.ObserverNotifier.notifyObserver(ObserverNotifier.java:165)
	org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:119)
	org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:112)
	org.jboss.weld.event.EventImpl.fire(EventImpl.java:83)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:118)

Manager Producer:

package br.com.jamalxvi.infra;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class EntityManagerProducer{
	
    private static EntityManagerFactory factory = 
        Persistence.createEntityManagerFactory("default");
    @Produces @RequestScoped
    public EntityManager getEntityManager(){
    	factory.getCache().evictAll();
    	EntityManager manager = factory.createEntityManager();
    	manager.clear();
        return manager;
    }
    public void close(@Disposes EntityManager manager){
        manager.close();
    }
}

Modelo Cliente:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.jamalxvi.modelo;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;

/**
 *
 * @author henrique
 */
@Entity
public class Cliente implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7977657403778698755L;
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
	@OneToOne(mappedBy="cliente", cascade=CascadeType.ALL )
    private Identificacao identificacao;
    @NotBlank @NotNull @Size(max=255)
    private String nome;
    private String rua;
    private String num;
    private String comp;
    private String bai;
    private String informacao;
    private String cep;
    private String cidade;
    private String estado;
    private boolean ativo;
    @Email
	private String email;
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL)
    private List<TelefoneCliente> telefones;
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL)
    private List<IdentificacaoVeiculo> veiculos;
    @OneToMany(mappedBy="cliente", cascade=CascadeType.ALL)
    private List<FotoPerfil> fotos;
    @OneToMany(cascade=CascadeType.ALL)
    private List<ServicosExecutados> autorizados;
    
	public List<ServicosExecutados> getAutorizados() {
		return autorizados;
	}

	public void setAutorizados(List<ServicosExecutados> autorizados) {
		this.autorizados = autorizados;
	}

	public List<IdentificacaoVeiculo> getVeiculos() {
		return veiculos;
	}

	public void setVeiculos(List<IdentificacaoVeiculo> veiculos) {
		this.veiculos = veiculos;
	}

	public List<FotoPerfil> getFotos() {
		return fotos;
	}

	public void setFotos(List<FotoPerfil> fotos) {
		this.fotos = fotos;
	}

	public Identificacao getIdentificacao() {
		return identificacao;
	}

	public void setIdentificacao(Identificacao identificacao) {
		this.identificacao = identificacao;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public List<TelefoneCliente> getTelefones() {
		return telefones;
	}

	public void setTelefones(List<TelefoneCliente> telefones) {
		this.telefones = telefones;
	}

	public Cliente() {
    }
    
    public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    
    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    
    
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getComp() {
        return comp;
    }

    public void setComp(String comp) {
        this.comp = comp;
    }

    public String getBai() {
        return bai;
    }

    public void setBai(String bai) {
        this.bai = bai;
    }

    public String getInformacao() {
        return informacao;
    }

    public void setInformacao(String informacao) {
        this.informacao = informacao;
    }

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
    
}

3 Respostas

guivirtuoso

O erro que está dando é uma exceção por você estar tentando acessar uma posição na coleção que parece não existir.

Isso deve estar ocorrendo pelo fato de ele não ter encontrado nenhum registro que satisfaça sua busca no método procura_id();

Eu trocaria:
Cliente cliente = query.getResultList().get(0);

Por isto:
Cliente cliente = query.getSingleResult();

Dessa forma se não houver resultados você evita o IndexOutOfBounds :wink:

J

Ola amigo, Obrigado pela resposta! No entanto este não é o problema. O problema é o fato de eu cadastrar um elemento com jpa e ele não aparecer. Somente depois de um tempo ou quando eu reinicio o servidor.
Obrigado.
Att Henrique Arantes Tiraboschi

guivirtuoso

Deve estar relacionado à transação.

Você pode estar tentando consumir uma informação dentro da própria transação que está cadastrando a mesma.

De uma verificada se a cada persistência no banco você está encerrando as transações corretamente p/ só depois realizar a consulta.

Abs

Criado 26 de janeiro de 2016
Ultima resposta 27 de jan. de 2016
Respostas 3
Participantes 2