Vraptor 4 - Criar e configurar um projeto [parte 2]

Depois de criar o projeto como mostrei na parte 1 desse post, vamos colocar para funcionar no eclipse usando o famoso Gato Antônio 8 "comedozim" de lixo. Para quem não lembra, esse que aparece na foto abaixo comendo lixo:

Imagem

Usei o eclipse Luna nesse projeto, mas acredito que não tenha problema com outra versão.

Primeiro descompacte a pasta do projeto no local de sua preferência. Depois importe o projeto como mostra as figuras abaixo:

   Imagem

Imagem

Imagem

Depois que importar o projeto, confira os arquivos do projeto e a estrutura de pacotes como mostra a imagem abaixo:

Imagem

Esse projeto já tem dois CRUDs: Produto e Category.

IMPORTANTE!!!

Antes de adicionar seu projeto no tomcat 8, inicie o toncat sem o projeto para ter certeza que seu toncat está ok. Se o tomcat não iniciar sem o projeto, você precisa primeiro resolver esse problema astes de continuar. Se está tudo ok com seu tomcat e ele inciou de boa sem o projeto, segue o barco!

Adicione o proejto ao tomcat:

Imagem

Imagem

Agora vamos tentar iniciar o tomcat:

Imagem

 Se tudo estiver errado do jeito que planejei, o tomcat não vai subir e deve aparecer esse erro no console:

     java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

Imagem

 

Até aqui você deve ter certeza de uma coisa: O problema é no projeto e não no tomcat, já que o tomcat consegue iniciar sem o projeto. 

Agora dê um "bicudo" no pom.xml do projeto e substitua o conteúdo do arquivo pom.xml por esse:

     <?xml version="1.0" encoding="UTF-8"?>
   <project
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
       xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <modelVersion>4.0.0</modelVersion>
       <groupId>br.com.davifelipe</groupId>
       <artifactId>davifelipe</artifactId>
       <version>1.0.0-SNAPSHOT</version>
       <packaging>war</packaging>
       <properties>
           <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
           <maven.compiler.source>1.7</maven.compiler.source>
           <maven.compiler.target>1.7</maven.compiler.target>
           <weld.version>2.1.2.Final</weld.version>
       </properties>
       <dependencyManagement>
           <dependencies>
               <dependency>
                   <groupId>org.jboss.spec</groupId>
                   <artifactId>jboss-javaee-6.0</artifactId>
                   <version>3.0.2.Final</version>
                   <type>pom</type>
                   <scope>import</scope>
               </dependency>
           </dependencies>
       </dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>br.com.caelum</groupId>
               <artifactId>vraptor</artifactId>
               <version>4.1.4</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>org.jboss.weld.servlet</groupId>
               <artifactId>weld-servlet-core</artifactId>
               <version>${weld.version}</version>
           </dependency>
           <dependency>
               <groupId>org.jboss.weld</groupId>
               <artifactId>weld-core-impl</artifactId>
               <version>${weld.version}</version>
           </dependency>
           <dependency>
               <groupId>javax.el</groupId>
               <artifactId>el-api</artifactId>
               <version>2.2</version>
               <scope>provided</scope>
           </dependency>
           <dependency>
               <groupId>org.hibernate</groupId>
               <artifactId>hibernate-validator-cdi</artifactId>
               <version>5.1.1.Final</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
               <scope>provided</scope>
           </dependency>
           <dependency>
               <groupId>javax.enterprise</groupId>
               <artifactId>cdi-api</artifactId>
               <version>1.1</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>javax.validation</groupId>
               <artifactId>validation-api</artifactId>
               <version>1.1.0.Final</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>br.com.caelum.vraptor</groupId>
               <artifactId>vraptor-jpa</artifactId>
               <version>4.0.3</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>org.hibernate</groupId>
               <artifactId>hibernate-entitymanager</artifactId>
               <version>4.3.9.Final</version>
               <scope>compile</scope>
           </dependency>
           <dependency>
               <groupId>org.postgresql</groupId>
               <artifactId>postgresql</artifactId>
               <version>9.4-1201-jdbc41</version>
           </dependency>
           <dependency>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-log4j12</artifactId>
               <version>1.7.21</version>
           </dependency>
           <dependency>
               <groupId>org.apache.logging.log4j</groupId>
               <artifactId>log4j-api</artifactId>
               <version>2.5</version>
           </dependency>
           <dependency>
               <groupId>org.apache.logging.log4j</groupId>
               <artifactId>log4j-core</artifactId>
               <version>2.5</version>
           </dependency>
           <dependency>
               <groupId>commons-io</groupId>
               <artifactId>commons-io</artifactId>
               <version>2.5</version>
           </dependency>
       </dependencies>
       <build>
           <finalName>${project.artifactId}</finalName>
           <plugins>
               <plugin>
                   <artifactId>maven-war-plugin</artifactId>
                   <version>2.4</version>
                   <configuration>
                       <failOnMissingWebXml>false</failOnMissingWebXml>
                   </configuration>
               </plugin>
               <plugin>
                   <artifactId>maven-compiler-plugin</artifactId>
                   <version>3.1</version>
                   <configuration>
                       <source>${maven.compiler.source}</source>
                       <target>${maven.compiler.target}</target>
                       <encoding>${project.build.sourceEncoding}</encoding>
                   </configuration>
               </plugin>
           </plugins>
       </build>
       <repositories>
           <repository>
               <id>mavenrepository</id>
               <name>maven repository</name>
               <url>http://mvnrepository.com/</url>
           </repository>
       </repositories>
   </project>
    

Agora dê uma limpada no projeto antes de tentar iniciar o tomcat com o projeto novamente.

Imagem

É recomendável também, fazer o famoso mvn clean install depois de alguma alteração em arquivos de configuração do projeto.

Agora vamos tentar subir o tomcat novamente. Se tudo estiver errado como o planejado, o tomcat sobe, mas dispara esse outro erro:

     javax.servlet.ServletException: Dependencies were not set. Do you have a Weld/CDI listener setup in your web.xml?

Imagem

Para resolver esse problema, adicione essa tag dentro da tag web-app do arquivo web.xml

     <listener>
       <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
     </listener>

O arquivo web.mxl deve ficar assim:

     <?xml version="1.0" encoding="UTF-8"?>
   <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
     <display-name>davifelipe</display-name>
     <context-param>
       <param-name>br.com.caelum.vraptor.encoding</param-name>
       <param-value>UTF-8</param-value>
     </context-param>
     <context-param>
       <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
       <param-value>pt_BR</param-value>
     </context-param>
     <session-config>
       <session-timeout>30</session-timeout>
     </session-config>
     <mime-mapping>
       <extension>ico</extension>
       <mime-type>image/x-icon</mime-type>
     </mime-mapping>
     <listener>
       <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
     </listener>
   </web-app> 

Agora pare o tomcat, vá em project> clean e tente iniciar o tomcat novamente! 

Maaaaaaaaaaaaaaaaasssssssss a vida é uma caixinha de surpresas! Se tudo estiver errado como o planejado, o tomcat sobe, dispara esse outro erro: 

Imagem

Além disso, na aba markers deve aparece esses problemas:

 Imagem

Mas é claro que dá erro de persistenceException! ainda não configuramos a conexão com banco de dados. Vamos lá!

Minha mãe me ensinou que eu não devo colocar os dados de conexão com banco de dados dentro do projeto, nesse caso vamos colocar os dados de conexão com banco de dados dentro do server.xm do tomcat:

Imagem

No meu caso, vou usar postgresql. Se quiser usar outro SGBD, adicione a dependência do mesmo no pom.xml e seja feliz! 

Antes de abrir o arquivo server.xml do tomcat precisamos criar o banco de dados. No meu caso vou criar um banco com o nome davifelipe

Agora no server.xml adicione essa tag dentro de GlobalNaminginRecources. Assumindo que o nome do banco é davifelipe, o server é localhost e a senha é 123456 

     <Resource auth="Container" driverClassName="org.postgresql.Driver" logAbandoned="true" maxIdle="10" maxTotal="20" maxWaitMillis="10000" name="jdbc/davi_datasource" password="123456" removeAbandonedOnBorrow="true" removeAbandonedOnMaintenance="true" removeAbandonedTimeout="180" type="javax.sql.DataSource" url="jdbc:postgresql://localhost:5432/davifelipe?autoReconnect=true" username="postgres" validationQuery="SELECT CURRENT_DATE" validationQueryTimeout="10000"/> 

Feito isso, vamos preparar nosso projeto para pegar essas informações do datasource que definimos com o nome de jdbc/davi_datasource

Nosso projeto vai pegar os dados de conexão com banco de dados desse datasource que está dentro do tomcat.

Abra o arquivo src/main/webapp/META-INF/context.xml (se o arquivo não existir, crie)

Esse arquivo deve ficar assim:

   <?xml version="1.0" encoding="UTF-8"?>
   <Context path="/davifelipe">
       <ResourceLink name="jdbc/davi_datasource" global="jdbc/davi_datasource" type="javax.sql.DataSource" />
   </Context>
   

Note que path="/davifelipe" é o path do proejto e global="jdbc/davi_datasource" faz referência ao nome do data source criado no server.xml do tomcat.

Agora vamos criar o arquivo presistence.xml no caminho: src/main/recources/META-INF/presistence.xml (se não existir a masta META-INF crie)

O conteúdo do arquivo deve ficar assim:

     <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
   <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
       <persistence-unit name="default">
           <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
           <non-jta-data-source>java:/comp/env/jdbc/davi_datasource</non-jta-data-source>
           <exclude-unlisted-classes>false</exclude-unlisted-classes>
           <properties>
               <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL9Dialect" />
               <property name="hibernate.show_sql" value="true" />
               <property name="hibernate.format_sql" value="true" />
               <property name="hibernate.hbm2ddl.auto" value="update" />
           </properties>
       </persistence-unit>
   </persistence>
   

No trecho <non-jta-data-source>java:/comp/env/jdbc/davi_datasource</non-jta-data-source> faz referência ao data sourcce criado no context.xml que por sua vez pega os dados de conexão do datasource criado no server.xml do tomcat. 

A tag <property name="hibernate.hbm2ddl.auto" value="update" /> está com o valor update. Dessa forma, toda vez que for criado um campo novo em qualquer entidade, o hibernate atualiza as tabelas no banco. No nosso caso, criamos apenas o banco de dados. Quando a aplição subir, as tabelas do banco serão criadas automaticamente pelo hibernate. 

Se mudar valor dessa tag para validate, você mesmo tem que atualizar o banco de dados toda vez que houver alteração na estrutura de dados da aplicação. Verifique a documentação para saber as outras opções para essa configuração. 

Dessa forma, os dados de conexão do ambiente de desenvolvimento fica no container de desenvolvimento e os dados de conexão do banco de dados de produção fica no container de produção. Logo, não preciso ficar gerenciado conexões de banco dentro da aplicação.

Se tudo estiver errado conforme o planejado, deve aparecer esse erro nas entidades do pacote model:

is managed, but is not listed in the persistence.xml file

Imagem

Para resolver esse problema, basta clicar com botão direito no arquivo presistence.xml e escolher Synchronize Class List:

Imagem

Ou clique com botão direto no projeto, vá em properties e marque a opção abaixo:

Imagem

Essa outra opção é melhor, por que você não vai precisar atualizar o arquivo persistence.xml sempre que criar uma entidade nova.

Se o tomcat estiver rodando, pare-o. limpe o projeto: (Project> clean), recomendo também mvn clean install.

Feito isso, inicie o tomcat com o projeto e finalmente, dessa vez, deve rodar normalmente:

Imagem

Se você chegou até aqui, as tabelas no banco de dados devem ter sido criadas pelo hibernate e os dois CRUDs do projeto devem está funcionando:

Imagem

 

Imagem

 

Imagem

Já está tudo ok, o projeto já está rodando mas ainda aparece um erro de JSP na aba markers.

Para resolver esse erro, clique com botão direito no projeto e escolha a opção "Properties"

Imagem

Escolha "project Facets" e depois "Runtimes"

Imagem

Marque a opção "Apache Tomcat v8.0" e clique em ok

Imagem

Feito isso, Não deve mais aparecer problemas na aba markers.

Agora sim. Você pode sair dizendo para todo mundo: "Eu sei VRaptor 4, CDI, Maven, JPA e hibernate" (Pelo menos fazer 2 CRUDs com paginação kkkkkkk)

Segue o link para baixar o projeto com todas essas configurações> clique aqui

Comentários

 

Quem Sou

Graduado em ADS (Análise e desenvolvimento de sistemas).

Não sou "devoto" de nenhuma linguagem de programação. Procuro aproveitar o melhor de cada uma de acordo com a necessidade do projeto. Prezo por uma arquitetura bem feita, código limpo, puro e simples! 

anuncio atendente