LazyInitializationException no VRaptor 3.3.0

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…

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?

[quote=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? [/quote]

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

quando está acontecendo a lazy init?

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 />.

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

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.

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

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?

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).

[quote=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).[/quote]

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?

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