LazyInitializationException no VRaptor 3.3.0

11 respostas
Eldius

Olá, estou tendo um problema de LazyInitializationException do Hibernate no VRaptor 3.

Já incluí o HibernateCustomProvider no web.xml.

Buscando no forum encontrei um problema semelhante, o qual foi solucionado incluindo o pacote “br.com.caelum.vraptor.util.jpa” nos parâmetros de contexto. Como eu faço para incluir esse pacote mais o meu pacote base da aplicação, separo por vírgulas? Tentei com vírgulas não funcionou, continuo com o mesmo erro.

Segue meu arquivo web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<display-name>sia-auditor</display-name>


	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>messages</param-value>
	</context-param>
	<context-param>
        	<param-name>br.com.caelum.vraptor.packages</param-name>
 	        <param-value>br.com.empresa, br.com.caelum.vraptor.util.hibernate</param-value>
    </context-param>
	<context-param>
	    <param-name>br.com.caelum.vraptor.provider</param-name>
	    <param-value>br.com.caelum.vraptor.util.hibernate.HibernateCustomProvider</param-value>
	</context-param>
	
	<filter>
		<filter-name>vraptor</filter-name>
		<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>vraptor</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>

    
	<error-page>
		<exception-type>br.com.empresa.app.interceptor.AuthenticationException</exception-type>
		<location>/</location>
	</error-page>

</web-app>

Não sei mais o que tentar…

11 Respostas

Lucas_Cavalcanti

vc tá usando o pacote do hibernate, que deixa a session aberta até o fim do request, então não deveria dar lazy initialization…

vc tá recebendo session ou sessionFactory como dependência das classes?

Eldius

Lucas Cavalcanti:
vc tá usando o pacote do hibernate, que deixa a session aberta até o fim do request, então não deveria dar lazy initialization…

vc tá recebendo session ou sessionFactory como dependência das classes?

Estou recebendo Session. E o controle de transação esta sendo feito normalmente via VRaptor.

Lucas_Cavalcanti

quando está acontecendo a lazy init?

Eldius

Quando eu uso a collection na JSP.

Eu tenho uma lista de objetos que utilizo para popular uma combo e comparo os elementos dessa lista com um atributo do meu objeto pra selecionar um deles.

Na minha JSP esta assim:

<p>
		<label for="medAreaAtendimento">Área de atendimento:&nbsp;
			<input type="text" name="med.areaAtendimento" id="medAreaAtendimento" value="<c:out value="${med.areaAtendimento }" />"/>
		</label>
		
		<label for="especialidadeIdCodEspecialidade">Especialidade:&nbsp;
			<select name="especialidade.id.codEspecialidade" id="especialidadeIdCodEspecialidade">
				<option>Escolha a especialidade</option>
				<c:forEach items="${especialidades }" var="esp">
					<option value="<c:out value="${esp.id.codEspecialidade }" />" <c:if test="${esp.id.codEspecialidade eq med.especialidades[0].id.codEsp } > selected="selected" </c:if> >
						<c:out value="${esp.descricao }" />
					</option>
				</c:forEach>
			</select>
		</label>
	</p>

E o erro ocorre na linha do <c:if />.

Lucas_Cavalcanti

vc tá criando a session na mão em algum lugar? essa página vem de um redirect, ou vc tá acessando diretamente?

Eldius

Eu estou recebendo a Session do VRaptor mesmo. Não crio ou altero Session em lugar algum nem mexo com Transaction ou SessionFactory…

Lembro que no meu TCC eu utilizei coisas semelhantes e não tive esse tipo de problemas. Será que pode ser algo da versão que estou utilizando? Não me lembro qual a versão que utilizei antes senão já teria tentado.

Lucas_Cavalcanti

a página vem de um redirect? todos os objetos que vc está usando na jsp vieram do controller?

Eldius

Ah, foi mal, esqueci de responder parte da pergunta… rsrs.

Mas então, eu tenho o método editar do meu controller, que busca uma instância específica do banco e adiciona ele ao meu result e em seguida eu uso um redirectTo.

O método esta assim:

public void editar(Long idMed, Long idConvenio) throws Exception {
		Medico med = medicoDao.get(new MedicoId(idMed, idConvenio));
		result.include("med", med);
		result.redirectTo(MedicoController.class).listar(null);
	}

E o listar esta assim:

public List<Medico> listar(Medico medico) throws Exception {

		List<Medico> resp = null;

		try {
			result.include("especialidades", espDao.list());

			resp = new Vector<Medico>();
			if (medico != null) {
				resp = medicoDao.list(medico);
			} else {
				resp = medicoDao.list();
			}
		} catch (Exception e) {
			logger.error("Erro ao exibir página de médicos.", e);
			result.include("msgNotif", "Erro ao listar médicos.");
		}
		return resp;
	}

Você insistindo na pergunta me leva à seguinte pergunta: o fato de vir de um redirect influencia nisso?

Lucas_Cavalcanti

o problema é esse então…

vc incluiu o med no result, e fez um redirect. Isso gera outra requisição, ou seja, outra session, por isso dá lazy init.

vc pode inicializar a collection que vc precisa antes do redirect (chamando med.getEspecialidades().size() por exemplo).

Eldius

Lucas Cavalcanti:
o problema é esse então…

vc incluiu o med no result, e fez um redirect. Isso gera outra requisição, ou seja, outra session, por isso dá lazy init.

vc pode inicializar a collection que vc precisa antes do redirect (chamando med.getEspecialidades().size() por exemplo).

Não havia pensado nessa possibilidade… Muito obrigado…

E aproveitando o assunto, há alguma outra forma de se executar a lógica de outro método, além de chamar ele diretamente, sem que seja criada uma nova requisição? Eu vi um forwardTo aqui, ele serviria pra isso?

Lucas_Cavalcanti

sim, o forwardTo executa sem fazer outra requisição.

Criado 10 de outubro de 2011
Ultima resposta 10 de out. de 2011
Respostas 11
Participantes 2