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

Deploy SpringMVC+JPA no WebLogic (Parte 1)

Boa tarde pessoal blz?

Estou com um problema para subir minha aplicaçao web ( SpringMVC + JPA + Hibernate tudo feito no maven) em um servidor Weblogic..

Failed to execute goal com.oracle.weblogic:weblogic-maven-plugin:12.1.3-0-0:deploy (default) on project webapp: weblogic.Deployer$DeployerException: weblogic.deploy.api.tools.deployer.DeployerException: Task 15 failed: [Deployer:149026]deploy application webapp on AdminServer.
[ERROR] Target state: deploy failed on Server AdminServer
[ERROR] java.lang.IllegalStateException: Specified field type [class br.com.embraer.ewe.basic.services.UserService] is incompatible with resource type [javax.persistence.EntityManager]

Eu ja fiz a troca do @Autowired por @PersistenceContext

@Service("userService")
@Transactional
public class UserService {

    //@Autowired <-- Aqui
    @PersistenceContext
    private UserRepository userRepository;


    public List<User> findAllUsers() {
        return userRepository.findAllUsers();
    }

    public User findById(Long id) {
        return userRepository.findById(id);
    }

    public User findByLogin(String login) {
        return userRepository.findByLogin(login);
    }

    public void saveUser(User user) {
        userRepository.saveUser(user);
    }
}

O que não compreendo é que possuo uma mesma classe de serviço identica para GroupService, porém essa nao da erro...


@Service("groupService")
@Transactional
public class GroupService {

    @PersistenceContext
    private GroupRepository groupRepositry;


    public List<Group> findAllGroups() {
        return groupRepositry.findAll();
    }

    public Group findGroupById(Integer id) {
        return groupRepositry.findById(id);
    }

    public void saveGroup(Group group) {
        groupRepositry.save(group);
    }
}

Alguma idéia de como resolver isso?

Abraços!

5 respostas

Fala Thales, tudo bem ?

Em geral se usa @PersistenceContext (annotation da JPA) sobre o atributo do tipo EntityManager (abstração da JPA) dentro dos seus repositories. E o texto que aparece na stack trace pode até sugerir isso - IllegalStateException: Specified field type [class br.com.embraer.ewe.basic.services.UserService] is incompatible with resource type [javax.persistence.EntityManager]. Parece que ele está esperando por um EntityManager e diz que é incompatível.

Tente fazer algo assim:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;
    ...
}
@Repository
public class UserRepository {

    @PersistenceContext // <- aqui sim se usam-se os recursos da JPA. Eles não deveriam vazar para a camada de serviço
    private EntityManager manager;
}

Espero ter ajudado. Abraço!

Ajudou sim... mas agora o erro persiste em outra parte... No EntityManagerFactory

[ERROR] Caused by: weblogic.deploy.api.tools.deployer.DeployerException: Task 8 failed: [Deployer:149026]deploy application e_weightevolution on AdminServer.
[ERROR] Target state: deploy failed on Server AdminServer
[ERROR] weblogic.application.ModuleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available:org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type 'javax.persistence.EntityManagerFactory' available

E eu fiz as alteraçoes que você me sugeriu

OBS: Eu to utilizando JavaConfig então nao tenho nenhum xml de configuração com exceção apenas desse do weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
    <wls:weblogic-version>12.1.1</wls:weblogic-version>
    <wls:context-root>e_weightevolution</wls:context-root>
    <wls:container-descriptor>
        <wls:prefer-application-packages>
            <wls:package-name>org.slf4j.*</wls:package-name>
        </wls:prefer-application-packages>
    </wls:container-descriptor>
</wls:weblogic-web-app>

Vou colocar o Log do erro inteiro, talvez ajude....

[ERROR] at weblogic.Deployer.run(Deployer.java:76)
[ERROR] at weblogic.Deployer.mainWithExceptions(Deployer.java:63)
[ERROR] at weblogic.tools.maven.plugins.deploy.DeployMojo.execute(DeployMojo.java:300)
[ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
[ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
[ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
[ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
[ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
[ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
[ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
[ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR] at java.lang.reflect.Method.invoke(Method.java:497)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
[ERROR] Caused by: weblogic.deploy.api.tools.deployer.DeployerException: Task 9 failed: [Deployer:149026]deploy application e_weightevolution on AdminServer.
[ERROR] Target state: deploy failed on Server AdminServer
[ERROR] weblogic.application.ModuleException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available:org.springframework.beans.factory.NoSuchBeanDefinitionException:No qualifying bean of type 'javax.persistence.EntityManagerFactory' available
solução!

Opa, tudo bem ?

Agora ta faltando na configuração um bean do tipo EntityManagerFactory que é quem provê as instâncias de EntityManager quando o container do Spring vai fazer a injeção solicitada no seu repository.

Vou postar aqui o código de uma classe de configuração (que tem a configuração dessa factory) como ela é utilizada pra configuração SPRING <-> SPRING ORM <-> JPA, no curso presencial de Spring da Caelum. Ela deve ajudar.

JPAConfig.java

@Configuration
@EnableTransactionManagement
public class JpaConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true");
        dataSource.setUsername("root");
        dataSource.setPassword("");
        return dataSource;
    }

    // implementação de EntityManagerFactory
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(dataSource);
        emf.setPackagesToScan(new String[] {"br.com.casadocodigo.loja.models"});
        emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.format_sql", "true");

        emf.setJpaProperties(properties);
        return emf;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        return new JpaTransactionManager(emf);
    }
}

Abraço!

Essa classe eu ja tenho com uma configuraçao um pouco diferente mas funcionou!..

Hahaha ta dificil viu.. Agora mudou o problema!

Rafael voce tem algum email de contato, se voce puder me ajudar?

Eu vou marcar como resolvido.. mas o problema agora é

[ERROR] java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

Abraços!

Fala Thales, tudo bem ?

Eu sugeriria você abrir um novo tópico aqui no fórum, assim todo o pessoal da comunidade pode ajudar.

Mas como você já adiantou o problema... NoSuchMethodError é o clássico problema cuja primeira suspeita é de incompatibilidade de versões entre as bibliotecas utilizadas.

A classe Table carregada (javax.persistence.Table) parece não tem o método indexes(). E algum outro código que a está utilizando acha que ela tem e faz a chamada. Tente ver qual versão você está utilizando da jpa, e ver desde qual versão ela passa a trazer o método indexes() na classe Table. No Javadoc deve ter essa informação.

Espero ter ajudado. Abraço!