VRaptor + EJB3

46 respostas
Y

Estou com problemas na anotação @EJB nos meus controllers do VRaptor.
Alguém tem uma dica para o seguinte stacktrace:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.k2studio.climp.ejb.BaseEJB] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.ejb.EJB(beanName=, mappedName=, beanInterface=class java.lang.Object, description=, name=, lookup=)}
	org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:297)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1055)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
root cause

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [br.com.k2studio.climp.ejb.BaseEJB] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.ejb.EJB(beanName=, mappedName=, beanInterface=class java.lang.Object, description=, name=, lookup=)}
	org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:896)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:765)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:428)
	org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:406)
	org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$EjbRefElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:687)
	org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
	org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
	org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:294)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1055)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
	org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:244)
	br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:59)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Meu controller está assim:

import javax.annotation.PostConstruct;
import javax.ejb.EJB;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.k2studio.climp.ejb.BaseEJB;

@Resource
public class LoginController {
	
	@EJB
	protected BaseEJB baseEJB;
	
	public LoginController() {
		
	}
	
	@PostConstruct
	public void init() {
		
	}
	
	@Get
	@Path("/")
	public void login() {
		
	}
	
}

Obs: Essa mesma estrutura no JSF está funcionando corretamente.

[]'s

Daniel

46 Respostas

G

yorgan, antes de mais nada no título do tópico vraptor está escrito errado :lol:

Lembre-se de que @EJB só funciona quando seu bean é controlado pelo container. No caso os controllers do vraptor são controlados pelo vraptor e não pelo container, sendo assim você não consegue injetar um EJB usando as annotations. Aliás a anotação @EJB só funciona para EJBs locais ou remotos que estejam dentro da mesma VM e mesmo domínio.

Eu uso EJB + Vraptor em meus projetos, e o que eu fiz foi um service locator para buscar meus EJBs. Obviamente a implementação de um service locator depende do appserver que você usa; a menos que você esteja usando JEE6, onde há um padrão usando o namespace global://.

DIga-nos a tua versão. Se precisar, te passo meu service locator.

Abraços

Y

Então, estou utilizando o JBoss 6 M2.
Segue minha estrutura:

BaseEJB:

import java.util.List;

import javax.ejb.Local;

import br.com.k2studio.climp.util.jpa.BaseEntity;

@Local
public interface BaseEJB {

	public void init();
	
	public void save(BaseEntity entity);
	
	public void update(BaseEntity entity);
	
	public BaseEntity findById(BaseEntity entity);
	
	public List<BaseEntity> findByNamedQuery(String namedQuery, BaseEntity entity);
}

BaseEJBImpl:

import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Stateless;

import br.com.k2studio.climp.ejb.dao.BaseDAO;
import br.com.k2studio.climp.util.jpa.BaseEntity;

@Stateless
public class BaseEJBImpl implements BaseEJB {

	@EJB
	protected BaseDAO dao;
	
	@PostConstruct
	public void init() {
		
	}
	
	public void save(BaseEntity entity) {
		dao.insert(entity);
	}

	public void update(BaseEntity entity) {
		// TODO
	}

	public void delete(BaseEntity entity) {
		// TODO
	}
	
	public BaseEntity findById(BaseEntity entity) {
		return null;
	}
	
	public List<BaseEntity> find(Class classe) {
		return null;
	}
	
	public BaseEntity findByNamedQuery() {
		return null;
	}
	
	public List<BaseEntity> findByNamedQuery(String namedQuery, BaseEntity entity) {
		return null;
	}
}

BaseDAO:

@Local
public interface BaseDAO {
	
	public void init();
	
	public void insert(BaseEntity entity);
	
	public void update(BaseEntity entity);
	
	public void remove(BaseEntity entity);
	
	public List<BaseEntity> selectByNamedQuery(String namedQuery, BaseEntity entity);

}

BaseDAOImpl:

@Stateless
public class BaseDAOImpl implements BaseDAO {

	@PersistenceContext(unitName="gerencial")
	protected EntityManager manager;
	
	@PostConstruct
	public void init() {
		
	}
	
	public void insert(BaseEntity entity) {
		manager.persist(entity);
		manager.flush();
	}
	
	public void update(BaseEntity entity) {
		manager.merge(entity);
		manager.flush();
	}
	
	public void remove(BaseEntity entity) {
		manager.remove(entity);
	}
	
	public List<BaseEntity> findByNamedQuery(String namedQuery) {
		return null;
	}
	
	public List<BaseEntity> selectByNamedQuery(String namedQuery, BaseEntity entity) {
		try {
			Query query = manager.createNamedQuery(namedQuery);
			Set<Parameter<?>> parameters = query.getParameters();
			for (Parameter<?> parameter : parameters) {
				String name = parameter.getName();
				Object value = PropertyUtils.getProperty(entity, name);
				query.setParameter(name, value);
			}
			return query.getResultList();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}
}

Como eu utilizaria um service locator?

[]'s

Daniel

G

yorgan, já peço desculpas antecipadamente por dar palpites, mas... não use generics nos EJBs. No casos das DAOs ou repositórios vocẽ até pode usar e abusar, porém a idéia de usar EJB é dele ter uma granularidade maior. Vocẽ usando isso estará quebrando a idéia de usar EJB.

Segue meu service-locator. Lembre-se de que antes do JEE6 cada appserver usava de uma forma diferente o endereço para exportar os EJBs. Já o JEE6 colocou um pouco de ordem e agora todos os EJBs seguem um padrão usando a namespace java:global. O endereço exportado dos EJBs fica como java:global + NOME-DO-EAR + NOME-DO-MODULO-EJB + NOME-DO-BEAN.

Conforme as naming conventions da Sun para EJB eu uso sempre Remote para interface remota e Bean, eu uso um replace de Remote para Bean para saber o endereço do EJB na árvore, já que o nome do bean na árvore é sempre baseado no Bean.

import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Busca um EJB a partir de sua interface remota/local.
 * 
 * @author Otávio Scherer Garcia
 * @version $Revision$
 */
public final class ServiceLocator {

    private static final Logger logger = LoggerFactory.getLogger(ServiceLocator.class);

    private static final String EJB_INFRAESTRUCTURE_LOOKUP = "Não foi possível estabelecer comunicação com o módulo remoto.";

    // inicializa o contexto JDNI local
    private static final InitialContext ctx;

    static {
        try {
            ctx = new InitialContext();
        } catch (NamingException e) {
            throw new InfraestructureException(EJB_INFRAESTRUCTURE_LOOKUP);
        }
    }

    /**
     * Retorna uma instância do EJB a partir da sua interface remota/local.
     * 
     * @param <T> Tipo da interface remota.
     * @param clazz Interface remota para fazer a busca.
     * @return Instância do EJB remoto.
     */
    public static <T> T lookup(Class<T> clazz) {
        String name = clazz.getSimpleName().replace("Remote", "Bean");
        name = "java:global/SEU-PROJETO/SEU-MODULO-EJB/" + name;

        try {
            logger.info("looking for EJB {} by {}", clazz, name);
            return (T) ctx.lookup(name);

        } catch (NamingException e) {
            throw new InfraestructureException(e);
        }
    }
}

E para usar:

private final BranchServiceRemote branchService = ServiceLocator.lookup(BranchServiceRemote.class);
G

Complementando, não consegui ainda estudar tudo sobre JEE6, então não sei se há uma forma mais automagica de fazer isso. O Lavieri estava fazendo uns testes com o CDI, quem sabe ele possa ajudar nisso.

Também não sei se o Spring tem alguma coisa para isso. Faz pelo menos uns 4 anos que não uso Spring, talvez ele saiba já como fazer um lookup inteligente e injetar automagicamente para você os EJBs.

Y

Tentei implementar o service locator, mas estou recebendo a seguinte mensagem:

20:10:23,071 INFO  [br.com.k2studio.climp.ejb.servicelocator.ServiceLocator] looking for EJB interface br.com.k2studio.climp.ejb.BaseEJB by java:global/app_ear/app_ejp/BaseEJB
20:10:34,692 ERROR [STDERR] javax.naming.NameNotFoundException: global not bound
G

Não conheço o JBoss, então é necessário ver se a versão que você usa implementa o JEE6. Vou pesquisar algo sobre isso e retorno logo que souber.

Y

Opa, achei a solução.
Tenho que utilizar o loockup no padrão //remote, que adaptando no seu service locator ficou assim:

public static <T> T lookup(Class<T> clazz) {
        String name = "app_ear/{interface}Impl/remote";
        name = name.replace("{interface}", clazz.getSimpleName());
        try {
            logger.info("looking for EJB {} by {}", clazz, name);
            return (T) ctx.lookup(name);
        } catch (NamingException e) {
           logger.error(EJB_INFRAESTRUCTURE_LOOKUP);
           e.printStackTrace();
        }
	return null;   
}

[]'s

Daniel

G

yorgan:
Opa, achei a solução.
Tenho que utilizar o loockup no padrão //remote, que adaptando no seu service locator ficou assim:

Caso alguém mais precise, segundo a especificação EJB:

Each portable session bean global JNDI name has the following syntax:

java:global[/]//[!]

only applies if the session bean is packaged within an .ear file. It defaults to the base name of the .ear file with no filename extension, unless specified by the application.xml deployment descriptor.

is the name of the module in which the session bean is packaged. In a stand-alone ejb-jar file or .war file, the defaults to the base name of the module with any filename extension removed. In an ear file, the defaults to the pathname of the module with any filename extension removed, but with any directory names included. The default can be overriden using the module-name element of ejb-jar.xml (for ejb-jar files) or web.xml (for .war files).

is the ejb-name of the enterprise bean. For enterprise beans defined via annotation, it defaults to the unqualified name of the session bean class, unless specified in the contents of the Stateless/Stateful/Singleton annotation name() attribute. For enterprise beans defined via ejb-jar.xml, it?s specified in the deployment descriptor element. The container registers a separate JNDI name entry for each local business interface, each remote business interface, and any no-interface view, 2.x local home interface, and 2.x remote home interface. For the no-interface view, the last portion of the entry name is the fully-qualified bean class name.

In addition to the previous requirements, if the bean exposes only one of the applicable client interfaces (or alternatively has only a no-interface view), the container registers an entry for that view with the following syntax:

java:global[/]//

The container is also required to make session bean JNDI names available through the java:app and java:module namespaces.

The java:app prefix allows a component executing within a Java EE application to access an application-specific namespace. The resulting syntax is: java:app//[!]

Note that is a required part of the syntax, even for names based on session bean components packaged within a stand-alone module.

The java:module prefix allows a component executing within a Java EE application to access a module-specific namespace. The resulting syntax is:

java:module/[!]

Note that the existence of global JNDI names for the Local and no-interface client views does not imply that cross-application access to those entries is required. See Section 3.2.2 for more details.

L

dentro do container Java EE 6 é possivel recuperar serviços sem precisar de lookups (digo lookups strings, você pode usar realmente um type e achará independente do container)

ainda não testei 100%, mas funciona...

segue como fazer

/**
 *
 * @author Tomaz Lavieri
 */
@javax.enterprise.context.Dependent
public class ContainerImpl implements Container{
    @javax.inject.Inject
    private javax.enterprise.inject.Instance&lt;Object&gt; container;

    public &lt;T&gt; T instanceFor(Class&lt;T&gt; type) {
        return container.select(type).get();
    }
}

vc consegue obeter uma instancia fazendo

@Inject
private Container container;

container.instanceFor(SuaClass.class);

ou ate mesmo

@Inject
SeuStatless statless;
G

Lavieri, de onde vêm essa classe Container? Aqui no meu Glassfish3 não achei ela (pelo menos nos imports do eclipse).

Você sabe se isso funciona para stateless e stateful?

Abraços, e obrigado por compartilhar.

L

garcia-jj:
Lavieri, de onde vêm essa classe Container? Aqui no meu Glassfish3 não achei ela (pelo menos nos imports do eclipse).

Você sabe se isso funciona para stateless e stateful?

Abraços, e obrigado por compartilhar.

Container é uma interface, esqueci de colocar ela =x

public interface Container { public <T> T instanceFor(Class<T> type); }

Funciona sim, tanto para Stateless como para Statefull…

a interface é apenas para separar melhor… minha idéia garcia, é implementar esse container para substituir o do spring do Vraptor, por isso escrevi essa interface, apenas como apoio

tanto o ContainerImpl como o Container foi eu mesmo que codei e escrevi.

G

Lavieri, muito boa a tua solução. Obrigado por compartilhar.

Mas esse @Inject do container… está retornando null. Onde essa classe deve estar? Coloquei ela dentro das minhas classes do projeto web, sendo que meu módulo EJB pe separado da aplicação web porém está dentro de um mesmo EAR.

L

garcia-jj:
Lavieri, muito boa a tua solução. Obrigado por compartilhar.

Mas esse @Inject do container… está retornando null. Onde essa classe deve estar? Coloquei ela dentro das minhas classes do projeto web, sendo que meu módulo EJB pe separado da aplicação web porém está dentro de um mesmo EAR.

O Contianer esta vindo null ??? isso esta errado hehehe…

O.o

provavelmente ta faltando o Serializable

sim sim passei por isso também, coloquei aqui a versão que peguei de outro post, meu aqui do guj, a versão correta é a seguinte

import java.io.Serializable;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

/**
 *
 * @author Tomaz Lavieri
 */
@Dependent
public class ContainerImpl implements Container, Serializable {
    @Inject
    private Instance<Object> container;

    public <T> T instanceFor(Class<T> type) {
        return container.select(type).get();
    }
}

depois do serializer isso resolveu ^^

Obs.: da retorno aqui dizendo se funcionou…

G

Pior que não. Notei agora, colocando Serializable, que o Spring está "tomando conta" do @Inject e tentando fazer o trabalho. Tentei tando colocando o @Inject do Container quanto do EJB.

@Resource
public class BranchController {

    @Inject
    private Container container;

    @Inject
    private BranchServiceRemote branchService;

}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private rge.cob.web.Container rge.cob.web.controller.BranchController.container; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [rge.cob.web.Container] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor
$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:504)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperty
Values(AutowiredAnnotationBeanPostProcessor.java:280)
	... 62 more
L

O spring é depencia do seu projeto web ?? ou é parte do container do glassfish ?? tenta retirar o spring por um instnate, e usar o @Inject

G

O Vraptor usa o Spring. Como você fez em seu projeto, ou você não usa o Vraptor + Spring?

Vou tentar um teste com um simples servlet, já que nesse caso o Spring não vai se meter, hehe :twisted:

L

O Vraptor usa o Spring. Como você fez em seu projeto, ou você não usa o Vraptor + Spring?

Vou tentar um teste com um simples servlet, já que nesse caso o Spring não vai se meter, hehe :twisted:

como te falei… a intenção é sacudir o SPRING no mato, e trabalhar como sendo o container esse ai que vc implementou… ainda estou estudando/implementando… quero tornar o VRaptor integrado com o JEE6, e modificar o seu contianer para ser gerenciador pelo proprio Java EE 6 CDI … ainda estou fazendo ajustes, e no momento dei uma pausa no processo para ler um o livro EJB em ação e para ler uma outra apostila sobre EJB…

enfim, se conseguir em definitivo pretendo ou commitar um FORK no github, ou deixar 100% compativel o vraptor com o JEE6, desligando o spring no ambiente ee6

G

Lavieri:
como te falei… a intenção é sacudir o SPRING no mato, e trabalhar como sendo o container esse ai que vc implementou… ainda estou estudando/implementando… quero tornar o VRaptor integrado com o JEE6, e modificar o seu contianer para ser gerenciador pelo proprio Java EE 6 CDI … ainda estou fazendo ajustes, e no momento dei uma pausa no processo para ler um o livro EJB em ação e para ler uma outra apostila sobre EJB…

enfim, se conseguir em definitivo pretendo ou commitar um FORK no github, ou deixar 100% compativel o vraptor com o JEE6, desligando o spring no ambiente ee6

Lavieri, voltei ao normal com meu service locator por enquanto. Ainda não tive tempo de estudar sobre o CDI, mas logo quero ver sobre ele. Aí vamos conversando, pois se precisar de algo, estou dentro. Não sou muito fã de ter um spring dentro de um projeto sendo que dá para usar as funcionalidades do container.

Abraços

L

garcia-jj:
Lavieri, voltei ao normal com meu service locator por enquanto. Ainda não tive tempo de estudar sobre o CDI, mas logo quero ver sobre ele. Aí vamos conversando, pois se precisar de algo, estou dentro. Não sou muito fã de ter um spring dentro de um projeto sendo que dá para usar as funcionalidades do container.

Abraços

de toda forma da uma testada sem o spring ^^ só pra ver se tudo ocorre bem…

G

Lavieri:
garcia-jj:
Lavieri, voltei ao normal com meu service locator por enquanto. Ainda não tive tempo de estudar sobre o CDI, mas logo quero ver sobre ele. Aí vamos conversando, pois se precisar de algo, estou dentro. Não sou muito fã de ter um spring dentro de um projeto sendo que dá para usar as funcionalidades do container.

Abraços

de toda forma da uma testada sem o spring ^^ só pra ver se tudo ocorre bem…

Vou criar um módulo web extra sem spring. Container e ContainerImpl ficam no módulo EJB ou no módulo web?

L

garcia-jj:
Lavieri:
garcia-jj:
Lavieri, voltei ao normal com meu service locator por enquanto. Ainda não tive tempo de estudar sobre o CDI, mas logo quero ver sobre ele. Aí vamos conversando, pois se precisar de algo, estou dentro. Não sou muito fã de ter um spring dentro de um projeto sendo que dá para usar as funcionalidades do container.

Abraços

de toda forma da uma testada sem o spring ^^ só pra ver se tudo ocorre bem…

Vou criar um módulo web extra sem spring. Container e ContainerImpl ficam no módulo EJB ou no módulo web?

O container é só uma facilidade… na verdade o que precisa ser feito é

@Inject private Instance&lt;Object&gt; container; //a partir dessa injeção vc consegue puxar qualquer objeto gerenciado pelo CDI
fazendo

então vc criar essa facilidade onde for usa-lo para injetar… ele pode ficar no base.jar por exemplo

G
yorgan:
Boa tarde Garcia,

Uma dúvida rápida.
Quando você utiliza o VRaptor com EJB, você mapeia as entidades no projeto EJB ou faz isso no projeto WEB?
Estou com um problema aqui para usar as entidades nos construtores dos métodos dos controllers.
Acredito que isso esteja acontecendo porque essas classes estão no projeto EJB.

Estou com o seguinte método declarado:
@Path("/privado/mudar/{usuario.id}")
   public void trocarClinica(Usuario usuario) {
     ....
   }

[]´s

Daniel

Em resumo trabalhando com EJB você tem que separar o que é entidade e os Transfer Objects. Entidade são as classes persistentes e que são um espelho do que você tem no banco. Já os TO ou DTO são objetos mais granulares e devem ser quase que especificos para uma tela, contendo não o mesmo conteúdo das entidades, mas sim os dados que você usa.

Quer um exemplo? Você tem uma entidade de Usuário e nela tem ID, NOME, EMAIL, SENHA. Você então no seu EJB tem três métodos: um que autentica, outro que lista os usuarios do sistema e outro que exibe os detalhes, certo? Eu faria assim:

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String email;
    private Group group;
    private String password;
}
Depois três classes que representam o usuário nos três cenários:
public class AuthenticatedUser { // usada para quando autenticar usuario
    private Long id;
    private String name;
}
public class UserDTO { // classe mais generica de usuário, usada em listagens e afins, apenas dados basicos do user
    private Long id;
    private String name;
}
public class UserDetailsDTO extends UserDTO { // classe com todos detalhes do usuario
    // id e name herda do UserDTO
    private String email;
    private String group;
}

Agora no meu EJB eu tenho as três operações

public class UserRemote {
    // autentica o usuario e retorna os dados do mesmo
    AuthenticatedUser authenticate(String email, String password);

    // retorna uma lista com dados resumidos do usuario, ideal para a tela de listagem em um crud
    // ou em um dropdown de usuarios
    List<UserDTO> findUsers();

    // retorna os dados completos de um usuário
    UserDetailsDTO findUser(Long id);
}

Pode parecer complicado no inicio, mas pense bem que caos é você enviar para a camada web a entidade User que contém até mesmo a senha do usuário... além disso você está trafegando entre as camadas dados que a outra não deveria ter conhecimento, etc.

Por uma serie de questões, inclusive segurança, todo bean que sai do módulo EJB o container corta a entity-manager. Lembre-se que quando você busca alguma entidade e ela é managed se você alterar algum dado nela o container persiste as alterações automaticamente, mesmo que você não chame o método merge ou persist. Isso é uma das razões que sempre que você sai de um EJB todos os vinculos com o container é perdido, ao contrário do que faz por exemplo o Spring ou o componente de JPA e Hibernate do Vraptor.

Não se se fui bem claro, mas vai perguntando. Abraços

Y

Obrigado Garcia,
Entendi e concordo com essa abordagem, parece ser mais interessante assim.

Bom final de semana a todos.

[]'s

Daniel

G

Lavirei, tentei usar com Servlet normal e sempre vem null. Estou com o Sun JDK 6 e Glassfish V3. Estranhamente todos @Inject que uso estão sempre nulos. Vou analisar com calma isso no final de semana.

Abraços, e muito obrigado por enquanto.

Y

Boa tarde pessoal,

Então, não deu muito certo a parte de criar objetos específicos para os formulários com o Garcia sugeriu.
Acabei de criar uma classe teste no mesmo projeto que estão os controllers e continuo recebendo o erro de java.lang.ClassNotFoundException.

Alguém tem mais uma dica para eu testar aqui?

[]´s

Daniel

G

Isso tudo depende como como você está usando seus projetos e como estão configurados. Vou te passar um exemplo de como uso aqui, usando EJB + Web separados.

Eu tenho 4 projetos no Eclipse: EAR, módulo EJB, EJB client e módulo web. O projeto EJB contém suas entidades e as implementações do seu EJB; o módulo EJB client possui seus transfer objects e as interfaces remotas/locais do seu EJB; e o módulo web possui suas classes do Vraptor e JSPs.

O módulo EAR serve apenas para colar todo mundo e para gerar o EAR, ou seja, ele vê todo mundo; o módulo EJB vê o módulo EJB client, o módulo EJB client não vê ninguém e o módulo web vê apenas o módulo EJB client. Essa configuração toda o Eclipse já faz para você quando você cria os projetos “Enterprise Project” e “EJB Project”. Creio que o Netbeans faça o mesmo.

O que eu creio estar acontecendo contigo é porque seu projeto está all-in-one. Quando você faz deploy o módulo EJB não consegue ler as classes que estão dentro do WAR, que é o projeto web. Assim pode dar esses class-not-found.

Como está sua estrutura?

Y

Estou utilizando uma estrutura parecida.

Tenho um módulo EJB+JPA que gerencia as entidades e DAO´s, um módulo EJB que gerencia os transfer objects e interfaces remotas/locais, um módulo WEB que gerencia os controllers e JSP´s e um módulo EAR que “junta” tudo.
No meu módulo WEB eu setei ambos os projetos EJB como dependências no menu Java EE Modules Dependencies das propriedades do projeto.
O estranho é que ele só não instancia o objeto se ele for recebido como parâmetro. Se eu instancio uma entidade no controller, set o ID e passo para o EJB fazer uma pesquisa, o processo ocorre normalmente. Isso tanto para o envio da entidade com os atributos setados como no retorno com a lista de objetos ou o objeto preenchido pelo JPA.

Ah, estou utilizando Eclipse também.

[]´s

Daniel

Y

Mais uma coisa, criei a seguinte classe diretamente no projeto WEB:

public class UsuarioTO {
	
	private String dsEmail;
	
	private String dsSenha;

        / /getters/setters

}

E tentei passar no controller de login da seguinte forma:

@Path("/login")
      public void login(UsuarioTO usuarioTO) {
            ......
      }

E mesmo assim recebi o erro java.lang.ClassNotFoundException.

[]´s

Daniel

L

tá dando ClassNotFoundException em qual classe? na UsuarioTO?

e vc diz que isso não funciona:

public void login(UsuarioTO usuarioTO) {
}

mas isso funciona:

public void login() {
   UsuarioTO usuarioTO = new UsuarioTO();
}

??

o id que vc tah falando eh uma classe do java ou da sua aplicação?

Y

Isso mesmo.
Até para tirar a dúvida criei um projeto novo.
Agora tenho um projeto WEB e um EAR.
Nesse projeto criei um arquivo JSP, um Controller e um objeto Usuario.
Seguem os arquivos:

JSP:

...HEAD..BODY...
	<form action="<c:url value='/login'/>" method="post" id="login_form">
		<table>
			<tr>
				<td height="30"><input type="text" class="medium" id="usuario.dsLogin"/> </td>
			</tr>
			<tr>
				<td height="30"><input type="password" class="medium" id="usuario.dsSenha"/> </td>
			</tr>
			<tr>
				<td align="right"><input type="submit" value="OK"/></td>
			</tr>
		</table>
	</form>
....

Controller:

package br.com.k2studio.controller;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.k2studio.to.Usuario;

@Resource
public class LoginController {
	
	@Path("/")
	public void index() {
		
	}
	
        //Assim recebo o StackTrace abaixo
	@Path("/login")
	public void login(Usuario usuario) {
	    System.out.println("Criou");
	}

        /* Assim funciona
	@Path("/login")
	public void login() {
		Usuario usuario = new Usuario();
		System.out.println("Criou");
	}
        */

}

Usuario:

package br.com.k2studio.to;

public class Usuario {
	
	private String dsLogin;
	
	private String dsSenha;
	
	public String getDsLogin() {
		return dsLogin;
	}

	public void setDsLogin(String dsLogin) {
		this.dsLogin = dsLogin;
	}

	public String getDsSenha() {
		return dsSenha;
	}

	public void setDsSenha(String dsSenha) {
		this.dsSenha = dsSenha;
	}	

}

StackTrace:

21:31:24,053 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/teste_web].[default]] Servlet.service() for servlet default threw exception: java.lang.ClassNotFoundException: br.com.k2studio.to.Usuario
	at java.lang.ClassLoader.findClass(ClassLoader.java:437)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:315)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
	at br.com.caelum.vraptor.http.asm.AsmBasedTypeCreator$1.loadClass(AsmBasedTypeCreator.java:114)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398)
	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
	at java.lang.Class.getMethod0(Class.java:2670)
	at java.lang.Class.getMethod(Class.java:1603)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:97)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:83)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:68)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:276)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:872)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)
	at java.lang.Thread.run(Thread.java:637)

Alguma idéia?

L

bom… eu sei pq isso tá acontecendo…

o problema é que a sua aplicação tem mais de um classLoader, e o do módulo web é diferente dos módulos de EJB =/ e tem um código específico que depende que a classe que vc esteja lidando esteja no mesmo classloader que o seu controller…

essa linha:

br.com.caelum.vraptor.http.asm.AsmBasedTypeCreator$1.loadClass(AsmBasedTypeCreator.java:114)

um jeito fácil de corrigir isso é criar uma classe wrapper, que pode até ser filha de Usuario se sua lógica depender disso… se essa classe estiver no módulo web vai funcionar…

vou marcar esse bug

Y

Mas e nessa última situação que coloquei?
Tanto o controller como a classe Usuario estão no mesmo projeto.
Nesse caso não tenho EJB’s, apenas o projeto Web Dynamic criado pelo Eclipse e o projeto EAR, também criado pelo Eclipse.

G

O mais estranho é que eu não tenho isso.

Y

To começando a achar que é coisa do JBoss 6.

L

imprime em algum lugar, dentro da aplicação:

System.out.println(VRaptor.class.getClassLoader());
System.out.println(AsmBasedTypeCreator.class.getClassLoader());
System.out.println(Usuario.class.getClassLoader());

o último deve ser diferente dos outros dois, e é aí que está o problema… o VRaptor está sendo carregado em outro classloader…

Y

Está diferente mesmo.

22:30:52,121 INFO  [STDOUT] BaseClassLoader@43095c6c{vfsfile:/Users/danielkist/Desenvolvimento/jboss-6.M2/server/default/conf/jboss-service.xml}
22:30:52,130 INFO  [STDOUT] BaseClassLoader@43095c6c{vfsfile:/Users/danielkist/Desenvolvimento/jboss-6.M2/server/default/conf/jboss-service.xml}
22:30:52,130 INFO  [STDOUT] BaseClassLoader@143f29ee{vfsfile:/Users/danielkist/Documents/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.0.0.M2/deploy/teste_ear.ear/teste_web.war/}

Pelo visto é porque estou rodando diretamente dentro do Eclipse.
Tem como contornar isso sem precisar exportar o projeto?

L

onde está o jar do vraptor? está na pasta do jboss?

Y

Está na pasta lib do JBoss.
Tive que colocar lá pois se eu deixo ele na pasta lib do projeto WEB o sistema retorna o seguinte stacktrace:

22:35:41,464 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] Error installing to Parse: name=vfsfile:/Users/danielkist/Documents/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.0.0.M2/deploy/teste_ear.ear/ state=PreParse mode=Manual requiredState=Parse: org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfsfile:/Users/danielkist/Documents/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.0.0.M2/deploy/teste_ear.ear/teste_web.war/
	at org.jboss.deployers.spi.DeploymentException.rethrowAsDeploymentException(DeploymentException.java:49)
	at org.jboss.deployment.WebAppFragmentParsingDeployer.createMetaData(WebAppFragmentParsingDeployer.java:94)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:322)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.createMetaData(AbstractParsingDeployerWithOutput.java:294)
	at org.jboss.deployers.spi.deployer.helpers.AbstractParsingDeployerWithOutput.deploy(AbstractParsingDeployerWithOutput.java:234)
	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:179)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1660)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1378)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1431)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1319)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:378)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:2029)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:1050)
	at org.jboss.dependency.plugins.AbstractController.executeOrIncrementStateDirectly(AbstractController.java:1289)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1213)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1107)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:918)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:633)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:898)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:677)
	at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:409)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:294)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
	at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:637)
Caused by: org.jboss.xb.binding.JBossXBException: Failed to parse source: Failed to resolve schema nsURI= location=web-fragment
	at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:203)
	at org.jboss.xb.binding.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)
	at org.jboss.xb.util.JBossXBHelper.parse(JBossXBHelper.java:229)
	at org.jboss.xb.util.JBossXBHelper.parse(JBossXBHelper.java:206)
	at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:137)
	at org.jboss.deployers.vfs.spi.deployer.SchemaResolverDeployer.parse(SchemaResolverDeployer.java:121)
	at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parseAndInit(AbstractVFSParsingDeployer.java:315)
	at org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer.parse(AbstractVFSParsingDeployer.java:280)
	at org.jboss.deployment.WebAppFragmentParsingDeployer.createMetaData(WebAppFragmentParsingDeployer.java:90)
	... 30 more
Caused by: org.jboss.xb.binding.JBossXBRuntimeException: Failed to resolve schema nsURI= location=web-fragment
	at org.jboss.xb.binding.sunday.unmarshalling.SundayContentHandler.startElement(SundayContentHandler.java:283)
	at org.jboss.xb.binding.parser.sax.SaxJBossXBParser$DelegatingContentHandler.startElement(SaxJBossXBParser.java:401)
	at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
	at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
	at org.apache.xerces.xinclude.XIncludeHandler.startElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.parse(SaxJBossXBParser.java:199)
	... 38 more

22:35:41,492 WARN  [org.jboss.system.server.profileservice.hotdeploy.HDScanner] Failed to process changes: org.jboss.deployers.client.spi.IncompleteDeploymentException: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):

*** DEPLOYMENTS IN ERROR: Name -> Error

vfsfile:/Users/danielkist/Documents/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.0.0.M2/deploy/teste_ear.ear/ -> org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfsfile:/Users/danielkist/Documents/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.0.0.M2/deploy/teste_ear.ear/teste_web.war/


DEPLOYMENTS IN ERROR:
  Deployment "vfsfile:/Users/danielkist/Documents/workspace/.metadata/.plugins/org.jboss.ide.eclipse.as.core/JBoss_6.0.0.M2/deploy/teste_ear.ear/" is in error due to the following reason(s): org.jboss.xb.binding.JBossXBRuntimeException: Failed to resolve schema nsURI= location=web-fragment

	at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:1198)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:1144)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.checkComplete(MainDeployerImpl.java:848)
	at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.checkComplete(MainDeployerAdapter.java:128)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:416)
	at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:294)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
	at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:637)
L

vc já tentou usar a nova versão do vraptor? a 3.1.2? acho que isso foi corrigido

Y

Não, mesmo com a 3.1.2, se eu deixar o JAR na pasta lib recebo esse erro.

L

faz o seguinte:

extraia o jar do vraptor pra uma pasta, remova o arquivo META-INF/web-fragments.xml, zipe a pasta e renomeie pra .jar no final… e use esse jar, deve funcionar…

o único problema é que vc vai ter que configurar o vraptor no web.xml… mas vc já deve estar fazendo isso

Y

Não estou conseguindo.
Fiz o processo e mudei a extensão para JAR, mas o Eclipse não está aceitando.

Todos os imports estão com erro.

L

conhece ant? tem ele na sua máquina? esse código é o suficiente pra gerar o jar:

<target name="jar" description="--> generate project's artifacts">
		<jar destfile="vraptor-3.1.2.jar" compress="true">
			<fileset dir="pasta/onde/ta/o/vraptor/extraido" includes="**/*.class" />
		</jar>
	</target>
L

gerei um snapshot do vraptor, com o web-fragments usando declaração de ns… vê se resolve…

http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.3-SNAPSHOT/vraptor-3.1.3-20100428.022446-1.jar

G

Essa história do class loader hell é complicada. O melhor é nunca deixar jars dentro do container. Dentro dele deixe apenas as coisas do servidor, e nunca as da sua aplicação.

Y

Opa, deu certo com esse snapshot, obrigado Lucas.

Concordo com você Garcia, mas até o momento se eu deixasse o Jar na lib do projeto o deploy simplesmente não dava certo.

Agora a Lib está no lugar e o projeto está rodando corretamente.

Mas amanhã continuo os testes.

Boa noite pessoal.

[]'s

Daniel

Criado 21 de abril de 2010
Ultima resposta 27 de abr. de 2010
Respostas 46
Participantes 4