Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Como usar um @Repository do spring em um ws com jax rs

Estou modularizando um projeto web construído com Spring MVC onde atualmente tenho o modelo, DAO e serviços centralizado neste único projeto e não há Web services disponibilizados, ou seja, todo o processamento e consumo é feito na aplicação. Pensando em futuramente expandir para mobile e facilitar a divisão do desenvolvimento decidi modularizar o projeto. Minha ideia é criar um projeto somente com minhas classes modelo e a DAO (Entity), um projeto para expor WS (Com JAX-RS), e um projeto cliente para consumir os recursos WS. Encontrei uma dificuldade ao pensar nas dependências entre os 4 projetos (Contendo com a aplicação web que vai consumir), a dúvida principal no momento é a seguinte: Na minha DAO utilizo anotações do Spring como @Repository e @PersistenceContext para injetar o Entity Manager, adicionei a dependência desse projeto com a DAO no projeto JAX-RS, porém quando utilizo algum repositório recebo um NullPointerException, ou seja, imagino que haja alguma configuração a ser feita para injetar esses componentes do Spring para serem usados no JAX-RS, alguém saberia como posso fazer isso?

9 respostas

Oi Renan,

ao meu ver vc tem dois possíveis caminhos:

1) Usar CDI para injetar os DAO (e administrar o EntityManager) com JAX-RS. Ou seja, vc usa o JavaEE para gerenciar os seus componentes, sem spring.

2) Usar Spring MVC para criar os seus serviços REST e assim continuar com o Spring gerenciando os DAOs e JPA etc. Ou seja, vc foca no Spring (com menos java ee, pois JPA vc continua usando).

Eu prefiro 2) pois considero o Spring o real padrão no mundo Java Enterprise mas isso é apenas minha humilde opinião.

abs

Oi Nico, obrigado pelas sugestões, vou pela primeira pois estou tentando replicar a estrutura que usam aqui na empresa por questão de aprendizado mas concordo com você. Estou com um pouco de dificuldade na configuração nesse caso, criei o persistence.xml dentro de resources/META_INF replicando as configurações que fazia via anotação no Spring mas estou levando uma Stack, consegue me dar uma força? Usei o Setup My Project adicionando JAX-RS para criar o projeto Maven

Caused by: java.lang.LinkageError: loader constraint violation: when resolving overridden method "org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider$Proxy$_$$_WeldClientProxy._configForReading(Lcom/fasterxml/jackson/databind/ObjectMapper;[Ljava/lang/annotation/Annotation;Ljava/lang/Class;)Lcom/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider$Proxy$_$$_WeldClientProxy, and its superclass loader (instance of org/jboss/modules/ModuleClassLoader), have different Class objects for the type com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase used in the signature
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
    at java.lang.Class.getConstructor0(Class.java:3075)
    at java.lang.Class.newInstance(Class.java:412)
    at org.jboss.weld.bean.proxy.DefaultProxyInstantiator.newInstance(DefaultProxyInstantiator.java:43)
    at org.jboss.weld.bean.proxy.ProxyFactory.run(ProxyFactory.java:334)
    at org.jboss.weld.bean.proxy.ProxyFactory.create(ProxyFactory.java:326)
    at org.jboss.weld.bean.proxy.ClientProxyFactory.create(ClientProxyFactory.java:83)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:209)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.createClientProxy(ClientProxyProvider.java:199)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.access$100(ClientProxyProvider.java:47)
    at org.jboss.weld.bean.proxy.ClientProxyProvider$CreateClientProxy.load(ClientProxyProvider.java:55)
    at org.jboss.weld.bean.proxy.ClientProxyProvider$CreateClientProxy.load(ClientProxyProvider.java:51)
    at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
    at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319)
    at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282)
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197)
    ... 44 more
Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.LinkageError: loader constraint violation: when resolving overridden method "org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider$Proxy$_$$_WeldClientProxy._configForReading(Lcom/fasterxml/jackson/databind/ObjectMapper;[Ljava/lang/annotation/Annotation;Ljava/lang/Class;)Lcom/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider$Proxy$_$$_WeldClientProxy, and its superclass loader (instance of org/jboss/modules/ModuleClassLoader), have different Class objects for the type com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase used in the signature
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:49)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCastCacheValue(LoadingCacheUtils.java:74)
    at org.jboss.weld.bean.proxy.ClientProxyProvider.getClientProxy(ClientProxyProvider.java:233)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:736)
    at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:765)
    at org.jboss.weld.util.ForwardingBeanManager.getReference(ForwardingBeanManager.java:61)
    at org.jboss.weld.bean.builtin.BeanManagerProxy.getReference(BeanManagerProxy.java:85)
    at org.jboss.resteasy.cdi.CdiConstructorInjector.construct(CdiConstructorInjector.java:65)
    at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2246)
    at org.jboss.resteasy.spi.ResteasyProviderFactory.addMessageBodyReader(ResteasyProviderFactory.java:806)
    at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1432)
    at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1368)
    at org.jboss.resteasy.plugins.providers.RegisterBuiltin.registerProviders(RegisterBuiltin.java:71)
    at org.jboss.resteasy.plugins.providers.RegisterBuiltin.register(RegisterBuiltin.java:31)
    at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:230)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:113)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36)
    at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
    at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78)
    at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
    at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:250)
    at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:133)
    at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:546)
    at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:517)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
    at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:559)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:101)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:82)
    ... 6 more
08:40:58,720 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 67) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host."/vetweb-1.0.0-SNAPSHOT": org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host."/vetweb-1.0.0-SNAPSHOT": com.google.common.util.concurrent.ExecutionError: java.lang.LinkageError: loader constraint violation: when resolving overridden method "org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider$Proxy$_$$_WeldClientProxy._configForReading(Lcom/fasterxml/jackson/databind/ObjectMapper;[Ljava/lang/annotation/Annotation;Ljava/lang/Class;)Lcom/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/resteasy/plugins/providers/jackson/ResteasyJackson2Provider$Proxy$_$$_WeldClientProxy, and its superclass loader (instance of org/jboss/modules/ModuleClassLoader), have different Class objects for the type com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase used in the signature
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:85)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
  <dependencies>

    <dependency>
      <groupId>vetweb</groupId>
      <artifactId>vetweb-entity</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <dependency>
      <groupId>vetweb</groupId>
      <artifactId>vetweb-commons</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <dependency>
       <groupId>dom4j</groupId>
       <artifactId>dom4j</artifactId>
       <version>1.6.1</version>
       <scope>provided</scope>
    </dependency>    

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

      <dependency>
          <groupId>javax.validation</groupId>
          <artifactId>validation-api</artifactId>
          <version>2.0.0.Final</version>
      </dependency>

      <dependency>
          <groupId>org.hibernate.javax.persistence</groupId>
          <artifactId>hibernate-jpa-2.1-api</artifactId>
          <version>1.0.0.Final</version>
      </dependency>

      <dependency>
          <groupId>org.postgresql</groupId>
          <artifactId>postgresql</artifactId>
          <version>9.4.1212</version>
      </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jaxrs</artifactId>
      <version>3.5.0.Final</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-servlet-initializer</artifactId>
      <version>3.5.0.Final</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jaxb-provider</artifactId>
      <version>3.5.0.Final</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jackson2-provider</artifactId>
      <version>3.5.0.Final</version>
      <scope>compile</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.5.0.Final</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.el</groupId>
      <artifactId>javax.el-api</artifactId>
      <version>3.0.0</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>

Oi Renan,

parece ser que o Wildfly já vem com Jackson e isso gera um conflito. Eu achei no abaixo uma solução:

https://stackoverflow.com/questions/22183809/wildfly-and-jackson-linkageerror

Tem como testar isso?

Obrigado, Nico

Nico, creio que é esse o problema mesmo. Adicionei o tal jboss-deployment-structure.xml ao meu META-INF com o conteúdo abaixo porém continuo recebendo a mesma Stack:

<jboss-deployment-structure> 
    <deployment>

      <dependencies>

        <module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import"/>
        <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" export="true"/>

      </dependencies>

      <exclusions>

        <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
        <module name="org.jboss.resteasy.resteasy-jettison-provider"/>

      </exclusions>

    </deployment>

</jboss-deployment-structure>
solução!

Criei novamente o projeto para executar na versão 10 do Wildfly com as seguintes dependências e funcionou normalmente:

    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <version>3.0.11.Final</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-jackson-provider</artifactId>
        <version>3.0.11.Final</version>
        <scope>provided</scope>       
    </dependency>