[RESOLVIDO]Seam em .war

7 respostas
jayro

Membros,

Tenho um projeto onde o mesmo está empacotado em um .EAR funcionando perfeito. Estou tentando empacotar esse projeto em um .war por ser mais eficiente, visto que o projeto não contém EJB’s para justificar o uso de .EAR. Consegui subir o projeto, mas em telas que usam um converterid está ocorrendo um erro informando que a classe converte não foi encontrada. O converter está definido no faces-config.xml e a classe encontra-se no projeto.

A única diferença entre a estrutura do projeto seam e um projeto java normal, é que o plugin do seam cria dois diretórios src: src/hot e src/main. No src/main, ficam os modelos e no src/hot, as controladoras (MVC). Já coloquei a classe nos dois pacotes e o problema ainda persiste.

Fico grato com qualquer dica que for dada.

:slight_smile:

7 Respostas

alias

jayro:
Membros,

Tenho um projeto onde o mesmo está empacotado em um .EAR funcionando perfeito. Estou tentando empacotar esse projeto em um .war por ser mais eficiente, visto que o projeto não contém EJB’s para justificar o uso de .EAR. Consegui subir o projeto, mas em telas que usam um converterid está ocorrendo um erro informando que a classe converte não foi encontrada. O converter está definido no faces-config.xml e a classe encontra-se no projeto.

A única diferença entre a estrutura do projeto seam e um projeto java normal, é que o plugin do seam cria dois diretórios src: src/hot e src/main. No src/main, ficam os modelos e no src/hot, as controladoras (MVC). Já coloquei a classe nos dois pacotes e o problema ainda persiste.

Fico grato com qualquer dica que for dada.

:)

Já me ocorreu esse mesmo problema, e ao que me lembro, a solução foi incluir os converters como “converters do Seam” (retirando-os do faces-config.xml e usando a anotação @Converter do Seam).

Caso ainda nao tenha resolvido o problema eu procuro aqui a solução de fato. Mas creio que foi isso ai mesmo.

jayro

alias:
jayro:
Membros,

Tenho um projeto onde o mesmo está empacotado em um .EAR funcionando perfeito. Estou tentando empacotar esse projeto em um .war por ser mais eficiente, visto que o projeto não contém EJB’s para justificar o uso de .EAR. Consegui subir o projeto, mas em telas que usam um converterid está ocorrendo um erro informando que a classe converte não foi encontrada. O converter está definido no faces-config.xml e a classe encontra-se no projeto.

A única diferença entre a estrutura do projeto seam e um projeto java normal, é que o plugin do seam cria dois diretórios src: src/hot e src/main. No src/main, ficam os modelos e no src/hot, as controladoras (MVC). Já coloquei a classe nos dois pacotes e o problema ainda persiste.

Fico grato com qualquer dica que for dada.

:)

Já me ocorreu esse mesmo problema, e ao que me lembro, a solução foi incluir os converters como “converters do Seam” (retirando-os do faces-config.xml e usando a anotação @Converter do Seam).

Caso ainda nao tenha resolvido o problema eu procuro aqui a solução de fato. Mas creio que foi isso ai mesmo.

Alias, obrigado pela dica. Não sabia que o Seam possibilitaria o uso de Converter’s nativamente. Encontrei o blog do Anselmo http://battisti.wordpress.com/category/java/seam-java/ com dicas e exemplos de uso. Muito bom por sinal. Irei testar e posto o resultado.

:slight_smile:

alias

Um detalhe que é dito na documentação (não sei se o link que postou fala sobre isso, não consegui abri-lo aqui no trampo :lol: ) ao usar a anotação @Converter do Seam, a anotação @ByPassInterceptors (ou algo assim…) é OBRIGATÓRIA, senão o converter não vai funcionar.

jayro

alias, não é comentado nada sobre @ByPassInterceptors no artigo. Mas pela filosofia do Seam, o converter virará um componente e que poderá ser chamado de qualquer view. Abaixo, um exemplo retirado do blog:

package br.unioeste.sgppls;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.persistence.EntityManager;

import org.jboss.seam.annotations.Name;

@Name("ConverterEntityarConhecimento")
@org.jboss.seam.annotations.faces.Converter
public class ConverterEntityarConhecimento implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
		try {
			EntityManager entityManager = (EntityManager) org.jboss.seam.Component
				.getInstance("entityManager", true);
			Object o = entityManager.createQuery(
				"from ArConhecimento ar WHERE ar.arCnhCodigo = :codigo")
				.setParameter("codigo", arg2).getSingleResult();
			return o;
		} catch (Exception e) {
			throw new ConverterException(e);
		}
	}

	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
		try {
			ArConhecimento a = (ArConhecimento) arg2;
			return a.getArCnhCodigo();
		} catch (Exception e) {
			throw new ConverterException(e);
		}
	}
}

Na View:

text" size="15" converter="ConverterEntityarConhecimento" required="true"/>

Fonte: http://battisti.wordpress.com/category/java/seam-java/

Ainda não testei, mas assim que eu chegar em casa, faço isso.
:slight_smile:

alias

Mas DEVERIA dizer! :lol: , pois o Seam valida essa anotação para componentes anotados com @Converter ou @Validator (alias, caso você tambem tenha validadores no faces-config.xml, eles tambem podem ser substituidos por componentes do Seam)

Eu uso a versão 2.2.2 do Seam e garanto que ele obriga sim o uso do @ByPassInterceptors nesses casos, talvez a versão do autor usada no artigo seja diferente. Mesmo que não obrigasse, nesse caso é extremamente recomendável o uso dessa anotação.

jayro

alias:

Mas DEVERIA dizer! :lol: , pois o Seam valida essa anotação para componentes anotados com @Converter ou @Validator (alias, caso você tambem tenha validadores no faces-config.xml, eles tambem podem ser substituidos por componentes do Seam)

Eu uso a versão 2.2.2 do Seam e garanto que ele obriga sim o uso do @ByPassInterceptors nesses casos, talvez a versão do autor usada no artigo seja diferente. Mesmo que não obrigasse, nesse caso é extremamente recomendável o uso dessa anotação.

alias, funcionou legal… show de bola mesmo. Esse projeto em específico está usando a versão 2.0.3.CR1 do Seam. Bom, a título de curiosidade… para o quer serve a annotacion @ByPassInterceptors ?

:slight_smile:

alias

jayro:

alias, funcionou legal… show de bola mesmo. Esse projeto em específico está usando a versão 2.0.3.CR1 do Seam. Bom, a título de curiosidade… para o quer serve a annotacion @ByPassInterceptors ?

:slight_smile:

Beleza cara, que bom que resolveu…é nois. :slight_smile:

entao, sobre a anotação @ByPassInterceptors. Por padrão, o Seam cria interceptadores para TODOS os componentes que são gerenciados por ele. Esses interceptadores (conceito de Programação Orientada a Aspecto), hã, “interceptam” ( :lol: ) as chamadas para os métodos do seu bean. Por exemplo, se voce tem um managed-bean anotado com @Name que usa nas suas paginas, o Seam intercepta todas as invocações de métodos do seu bean, por exemplo a action de um botão da pagina. Ele faz isso pra fazer a injeção de dependencia principalmente, entre outras coisas possiveis de se fazer com isso.

Como voce pode imaginar isso gera um pequeno overhead, já que TODA vez que o seu bean for chamado primeiro o Seam vai executar o codigo dele e depois o seu. Isso pode causar lentidão, e a anotação @ByPassInterceptors serve pra alterar esse comportamento. Com essa anotação o Seam nao cria o interceptador para o seu objeto. É ideal nesse caso do Converter ou do Validator, por exemplo, que voce simplesmente quer chamar o método pra converter/validar, sem maiores coisas no meio disso.

É claro que uma classe anotada com @ByPassInterceptors nao pode usar a injeção de dependência do Seam, já que nao tem o interceptador. O uso dessa anotação só é recomendado mesmo para ganho de performance, em casos de beans que os métodos são chamados seguidamente (tipo o Converter, hehe)

Bom, a explicação ficou meio grande, mas é isso ai :lol: .

Criado 14 de setembro de 2011
Ultima resposta 15 de set. de 2011
Respostas 7
Participantes 2