Dúvida VRaptor -> Representation

[quote=farialef]O Transactional interceptor só está disponível na última versão do plug-in vraptor-jpa? Eu ia usar a versão 1.0.0 do plug-in, porque estou usando o vraptor 3.5.1. Posso usar a última versão do vraptor-jpa (4.0.0) mesmo usando vraptor 3.5.1?
[/quote]
A última versão é só pra VRaptor 4 mesmo… mas vc pode pedir para publicar uma compatível com a 3.5.x (https://github.com/caelum/vraptor-jpa/issues
Embora eu ache que valha mais a pena já mudar o sistema pro VRaptor 4

Tentou ler a versão atualizada do livro pra VRaptor 4? Ela explica como fazer tudo isso. O vraptor-scaffold não foi atualizado para o 4 ainda =/

[quote=farialef]
Fiquei com uma dúvida importante com relação a integração dos sistemas livraria-admin e livraria-site. Confesso que achei um pouco estranho essa separação em dois sistemas e não entendi porque a parte web não acessa o BD.[/quote]
A idéia é que o admin é um sistema restrito, usado por poucas pessoas, onde os livros serão cadastrados e modificados. E a parte web vai ser pública acessada por milhares de pessoas (se o site fizer sucesso ;)) em que praticamente não vai haver escritas, só qdo a pessoa resolver comprar mesmo o Livro. Essas duas partes poderiam conviver no mesmo servidor, mas se vc separa em dois serviços/aplicações vc pode colocá-las em servidores diferentes (ex. 1 servidor pro admin, mas 10 servidores para o site, que tem mtos usuários simultâneos). Outro motivo é para poder mostrar a parte de integrações entre sistemas no livro :wink:

A parte Web não acessa o BD pq a admin já faz isso. Fazer a integração entre dois sistemas compartilhando o BD não é uma boa idéia na maioria das vezes. Vc acaba tendo que duplicar código de mapeamento, controle de acesso, distribuir credenciais do banco, lidar com consistência, migrações de dados. Se vc deixa o BD em apenas um serviço e o outro apenas o consulta via API (HTTP por exemplo), esses problemas são menores.
Pesquise sobre SOA (arquitetura orientada a serviços)

para buscar os livros, vc fez um GET /livros e veio um XML com uma lista de livros.

se vc quiser registrar uma compra, vc faria por exemplo um POST /compras passando os objetos necessários serializados em xml
(ex uma Compra que tem os atributos Usuario e Livro)

[quote=farialef]
Além do problema da gravação do pedido de compra, como ficaria o cadastro do cliente e a sua autenticação para fechar o pedido de compra no livraria-site? Teria algum código de exemplo?[/quote]
Existem várias maneiras de fazer isso. Um dos jeitos é fazer o controle de usuários no livraria-site (em outro BD, diferente do livraria-admin).
Outro é deixar tudo no admin e o site faz o meio de campo recebendo os dados de usuário e repassando para o admin (em GETs e POSTs)

É como se vc tivesse um DAO, mas ao invés do método salvar fazer um manager.persist, ele vai fazer um POST /usuarios para o admin.
Ao invés do método lista() fazer um manager.createQuery, ele vai fazer um GET /livros.

Lucas,

Obrigada pelos esclarecimentos das dúvidas anteriores. Vou conferir a nova versão do livro.

Estou desenvolvendo um site de e-commerce de produtos para trabalho final na faculdade. Seguindo a abstração de estante para o caso de livros, qual seria a abstração de onde se guarda produtos? No caso de produtos não seria estante, pode me dar uma sugestão para o nome dessa classe que faria o papel de estante, mas que seria responsável por guardar produtos

Pensando na melhor organização do códigos nos sistemas livraria-admin e livraria-site, gostaria de saber em qual pacote colocar cada classe.

Criei para livraria-admin os seguintes pacotes : controlador, dao, infra e modelo. Estou na dúvida onde colocar as seguintes classes:
Arquivo.java,
ArquivoDownload.java,
Diretorio.java,
DiretorioNoBD.java,
Entity.java,
Estante,
EstanteNoBD.java,
RegistroDeUsuarios.java,
RegistroDeUsuariosNoBD,
UsuarioLogado e
UploadedFileConverter.java

para livraria-site criei os pacotes: controlador, modelo e serviço.Estou na dúvida onde colocar as seguintes classes:
Acervo.java,
AcervoNoAdmin.java,
ClienteHTTP.java,
ServidorIndisponivelException.java e
URLClienteHTTP.java

O que fizer sentido pro domínio. Por exemplo Prateleira ou Estoque. Mas se não existir um nome bom, pode ir pros padrões (tipo ProdutoRepository)

não existe ‘melhor organização’. Existem vários estilos de organização de pacotes, cada um com vantagens e desvantagens. Mas no caso específico posso falar alguns guidelines:

  • As classes/interfaces que fazem parte da lógica de negócio/domínio devem ir no pacote modelo.
  • Os controllers e classes que tem a ver com o controle de requisições vão no pacote controlador
  • As implementações das interfaces que vão para o BD ficariam no pacote DAO.
  • Classes que tem a ver com infraestrutura (suporte às lógicas de negócio, personalizações das libs) vão no infra.

Lucas,

Então, todas as classes de implementação com o sufixo “NoBD” (ex: EstanteNoBD.java e RegistroDeUsuariosNoBD.java) ficam no pacote “dao”, ok?

As classes de entidade e as interfaces (ex: Entity.java, Estante.java, RegistroDeUsuarios.java e Acervo.java) ficam em “modelo”, ok?

Minhas dúvidas são:
[b]1) Se a classe UsuarioLogado.java fica em “modelo”?

  1. Se a classe UploadedFileConverter.java fica em “infra”?

  2. Se a classe ClienteHTTP.java fica em “modelo”?

  3. Se as classes AcervoNoAdmin.java e URLClienteHTTP.java ficam em “servico”?

  4. Não sei se vale a pena criar outros pacotes, tais como, “validador” ou “validator” para agrupar classes de validação (LivroValidator.java) e “excecao” ou “exception” para agrupar classes de exceção (ServidorIndisponivelException.java)?

  5. Finalmente, seria interessante separar as classes criadas para upload/download em um pacote denominado “arquivo” a parte (Arquivo.java, ArquivoDownload.java, DiretorioNoBD.java e UploadedFileConverter.java). Nesse caso, mesmo Arquivo.java sendo classes de entidade ficaria no pacote “arquivo” ou ficaria em “modelo”? Também nesse caso, DiretorioNoBD.java ficaria em “arquivo” ou em “dao”? E UploadedFileConverter.java ficaria em “arquivo” ou em “infra”?[/b]

Lendo o apêndice do livro que explica o funcionamento do VRaptor, vi um exemplo interessante de como mudar convenções no VRaptor. Segue, abaixo, o trecho do livro.

[b]"Um exemplo de mudança é se quisermos mudar a convenção para colocar /admin antes dos controllers que estão no pacote terminado em .admin:

@Component @ApplicationScoped
public class AdminRoutesParser extends PathAnnotatedRoutesParser {
// delega o construtor

@Override
protected String extractControllerNameFrom(Class<?> type) {
String controllerName = super.extractControllerNameFrom(type);
if (type.getPackage().getName().endsWith(".admin")) {
return “admin/” + controllerName;
}
return controllerName;
}
}

Como criamos um componente na aplicação que implementa o RoutesParser, ela sobrescreverá a implementação do VRaptor. Desse modo, a
convenção padrão passa a ser /admin/nomeDoController/nomeDoMetodo se o pacote terminar com .admin."[/b]

Basta criar essa classe e já conseguimos mudar essa convenção ou temos de fazer algo mais?

Como mudar a convenção do VRaptor, caso quisermos colocar as partes admin e site no mesmo projeto java web? Minha orientadora, não quer a solução de separar as duas partes em dois sistemas. Ela quer que eu crie um pacote admin e um pacote site, com os subpacotes modelo, controlador, etc abaixo deles. E para os jsp, ela quer que crie uma pasta admin e outra pasta site. Qual seria a solução usando VRaptor para que as partes admin e site convivam dentro de um único projeto(sistema), ou seja, no exemplo de livraria gostaria de uma solução onde só fosse criado apenas um projeto - livraria - com as partes admin e site dentro desse projeto. Como implementar isso?

  1. Sim

  2. Sim

  3. ela é mais um serviço, algo que dá suporte à aplicação. Modelo é para as classes do negócio.

  4. eu talvez colocaria a URLClienteHTTP em infra

  5. se existirem classes o suficiente com esses papéis, talvez valha a pena.

  6. esse é outro estilo de organização de pacotes, por funcionalidade. Tipo pacotes “arquivos”, “livros”, “usuarios”, e dentro deles todas as classes dessa funcionalidade, incluindo controllers, validators, services, daos, etc.

Lendo o apêndice do livro que explica o funcionamento do VRaptor, vi um exemplo interessante de como mudar convenções no VRaptor. Segue, abaixo, o trecho do livro.

"Um exemplo de mudança é se quisermos mudar a convenção para colocar /admin antes dos controllers que estão no pacote terminado em .admin:

@Component @ApplicationScoped
public class AdminRoutesParser extends PathAnnotatedRoutesParser {
// delega o construtor

@Override
protected String extractControllerNameFrom(Class<?> type) {
String controllerName = super.extractControllerNameFrom(type);
if (type.getPackage().getName().endsWith(".admin")) {
return “admin/” + controllerName;
}
return controllerName;
}
}

Como criamos um componente na aplicação que implementa o RoutesParser, ela sobrescreverá a implementação do VRaptor. Desse modo, a
convenção padrão passa a ser /admin/nomeDoController/nomeDoMetodo se o pacote terminar com .admin."

Basta criar essa classe e já conseguimos mudar essa convenção ou temos de fazer algo mais?

Como mudar a convenção do VRaptor, caso quisermos colocar as partes admin e site no mesmo projeto java web? Minha orientadora, não quer a solução de separar as duas partes em dois sistemas. Ela quer que eu crie um pacote admin e um pacote site, com os subpacotes modelo, controlador, etc abaixo deles. E para os jsp, ela quer que crie uma pasta admin e outra pasta site. Qual seria a solução usando VRaptor para que as partes admin e site convivam dentro de um único projeto(sistema), ou seja, no exemplo de livraria gostaria de uma solução onde só fosse criado apenas um projeto - livraria - com as partes admin e site dentro desse projeto. Como implementar isso???

Sim, no VRaptor 3 é só criar a classe.

vc pode criar essa classe AdminRoutesParser e vc precisa criar uma AdminPathResolver que extends de DefaultPathResolver e faz uma alteração bem parecida.

cria essa classe no eclipse, e dê um ctrl+espaço no meio dela pra ver os métodos que podem ser sobrescritos.

Não esqueça da anotação @Component e @ApplicationScoped.

Lucas,

Como minha aplicação vai se dividir em duas partes no mesmo projeto: admin e site. Nesse caso, as páginas .jsp referentes a parte admin ficarão no caminho “WEB-INF/jsp/admin” e as páginas .jsp referentes a parte site ficarão ou no caminho “WEB-INF/jsp” ou “WEB-INF/jsp/site”. Então, seguindo sua orientação, criei as classes: CustomRoutesParser.java e CustomPathResolver.java. Entretanto, logo de cara aconteceu a seguinte situação. Quando não coloco @ApplicationScoped em CustomPathResolver.java a aplicação funciona perfeitamente. Mas quando coloco @ApplicationScoped em CustomPathResolver.java dá erro direto na aplicação. O que pode ser?

Seguem os respectivos códigos de cada classe abaixo e também a log com o erro.

package br.com.casadocodigo.livraria.vraptor;

import br.com.caelum.vraptor.http.route.PathAnnotationRoutesParser;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;

@Component @ApplicationScoped
public class CustomRoutesParser extends PathAnnotationRoutesParser {

public CustomRoutesParser(Router router) {
	super(router);
	// TODO Auto-generated constructor stub
}

@Override
protected String extractControllerNameFrom(Class<?> type) {
	String controllerName = super.extractControllerNameFrom(type);
	if (type.getPackage().getName().endsWith(".admin")) {
		return "/admin" + controllerName;
	}
	return controllerName;
}

}


package br.com.casadocodigo.livraria.vraptor;

import br.com.caelum.vraptor.http.FormatResolver;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.caelum.vraptor.view.DefaultPathResolver;

@Component @ApplicationScoped
public class CustomPathResolver extends DefaultPathResolver {

public CustomPathResolver(FormatResolver resolver) {
	super(resolver);
	// TODO Auto-generated constructor stub
}

@Override  
public String pathFor(ResourceMethod method) {  
	String path = super.pathFor(method);  

    if (method.getResource().getType().getPackage().getName().endsWith(".admin")) {  
              return path.replaceFirst(getPrefix(), getPrefix() + "/admin/");  
    }  
    return path;  
  
}  

}


Jul 06, 2014 12:38:11 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.7.0_17\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jdk1.7.0_17/bin/…/jre/bin/server;C:/Program Files/Java/jdk1.7.0_17/bin/…/jre/bin;C:/Program Files/Java/jdk1.7.0_17/bin/…/jre/lib/amd64;C:\oracle\product\10.2.0\client_1\bin;C:\Program Files\Java\jdk1.7.0_17\bin;C:\Program Files\apache-ant-1.9.4\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Common Files\Roxio Shared\10.0\DLLShared;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared;C:\Program Files (x86)\Sony\VAIO Startup Setting Tool;C:\Program Files (x86)\Windows Live\Shared;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn;c:\Program Files\Microsoft SQL Server\100\Tools\Binn;c:\Program Files\Microsoft SQL Server\100\DTS\Binn;c:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE;c:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn;C:\sqlite;C:\Program Files (x86)\MySQL\MySQL Utilities 1.3.4;C:\langs\Ruby193\bin;C:\Program Files\Java\jdk1.7.0_17\bin;C:\eclipse;;.
Jul 06, 2014 12:38:11 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:tryon-site’ did not find a matching property.
Jul 06, 2014 12:38:11 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:livraria-admin’ did not find a matching property.
Jul 06, 2014 12:38:11 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [“http-bio-8080”]
Jul 06, 2014 12:38:11 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [“ajp-bio-8009”]
Jul 06, 2014 12:38:11 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 617 ms
Jul 06, 2014 12:38:11 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jul 06, 2014 12:38:11 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.33
14-07-06 12:38:13,716 [INFO] br.com.caelum.vraptor.config.BasicConfiguration - Using class br.com.caelum.vraptor.ioc.guice.GuiceProvider as Container Provider
14-07-06 12:38:14,482 [INFO] br.com.caelum.vraptor.config.BasicConfiguration - br.com.caelum.vraptor.scanning = null
14-07-06 12:38:14,482 [INFO] br.com.caelum.vraptor.scan.WebAppBootstrapFactory - Dynamic WebAppBootstrap found.
14-07-06 12:38:14,560 [ERROR] br.com.caelum.vraptor.scan.ScannotationComponentScanner - There’s no occurence of package br.com.caelum.vraptor.util.jpa in classpath
14-07-06 12:38:14,841 [INFO] br.com.caelum.vraptor.core.DefaultConverters - Registering bundled converters
14-07-06 12:38:15,014 [INFO] org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
14-07-06 12:38:15,014 [INFO] org.hibernate.cfg.Environment - Hibernate 3.6.4.Final
14-07-06 12:38:15,014 [INFO] org.hibernate.cfg.Environment - loaded properties from resource hibernate.properties: {initialPoolSize=3, maxPoolSize=20, hibernate.connection.driver_class=com.mysql.jdbc.Driver, preferredTestQuery=select 1, hibernate.format_sql=true, hibernate.query.substitutions=true=1, false=0, hibernate.connection.username=root, acquireIncrement=5, timeout=25200, hibernate.hbm2ddl.auto=update, hibernate.connection.url=jdbc:mysql://localhost/livraria, idleConnectionTestPeriod=100, hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider, hibernate.bytecode.use_reflection_optimizer=false, hibernate.show_sql=true, hibernate.connection.password=, minPoolSize=3}
14-07-06 12:38:15,014 [INFO] org.hibernate.cfg.Environment - Bytecode provider name : javassist
14-07-06 12:38:15,029 [INFO] org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
14-07-06 12:38:15,092 [INFO] org.hibernate.ejb.Version - Hibernate EntityManager 3.6.4.Final
14-07-06 12:38:15,279 [INFO] org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: br.com.casadocodigo.livraria.admin.modelo.Usuario
14-07-06 12:38:15,326 [INFO] org.hibernate.cfg.annotations.EntityBinder - Bind entity br.com.casadocodigo.livraria.admin.modelo.Usuario on table Usuario
14-07-06 12:38:15,373 [INFO] org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: br.com.casadocodigo.livraria.admin.modelo.Arquivo
14-07-06 12:38:15,373 [INFO] org.hibernate.cfg.annotations.EntityBinder - Bind entity br.com.casadocodigo.livraria.admin.modelo.Arquivo on table Arquivo
14-07-06 12:38:15,373 [INFO] org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: br.com.casadocodigo.livraria.admin.modelo.Livro
14-07-06 12:38:15,373 [INFO] org.hibernate.cfg.annotations.EntityBinder - Bind entity br.com.casadocodigo.livraria.admin.modelo.Livro on table Livro
14-07-06 12:38:15,388 [INFO] org.hibernate.cfg.Configuration - Hibernate Validator not found: ignoring
14-07-06 12:38:15,404 [INFO] org.hibernate.validator.util.Version - Hibernate Validator 4.2.0.Final
14-07-06 12:38:15,529 [INFO] org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
14-07-06 12:38:15,529 [INFO] org.hibernate.connection.ConnectionProviderFactory - Initializing connection provider: org.hibernate.connection.C3P0ConnectionProvider
14-07-06 12:38:15,529 [INFO] org.hibernate.connection.C3P0ConnectionProvider - C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost/livraria
14-07-06 12:38:15,529 [INFO] org.hibernate.connection.C3P0ConnectionProvider - Connection properties: {user=root, password=
, autocommit=true, release_mode=auto}
14-07-06 12:38:15,529 [INFO] org.hibernate.connection.C3P0ConnectionProvider - autocommit mode: true
14-07-06 12:38:15,544 [INFO] com.mchange.v2.log.MLog - MLog clients using log4j logging.
14-07-06 12:38:15,607 [INFO] com.mchange.v2.c3p0.C3P0Registry - Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; debug? true; trace: 10]
14-07-06 12:38:15,685 [INFO] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource - Initializing c3p0 pool… com.mchange.v2.c3p0.PoolBackedDataSource@aaf8bdc5 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@a3e9353b [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge13s933f480n7wsw0j|606492bb, idleConnectionTestPeriod -> 100, initialPoolSize -> 3, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@9a15112f [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hge13s933f480n7wsw0j|448c2f42, jdbcUrl -> jdbc:mysql://localhost/livraria, properties -> {user=******, password=******, autocommit=true, release_mode=auto} ], preferredTestQuery -> select 1, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hge13s933f480n7wsw0j|68f18e9f, numHelperThreads -> 3 ]
14-07-06 12:38:15,919 [INFO] org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.MySQLDialect
14-07-06 12:38:15,934 [INFO] org.hibernate.engine.jdbc.JdbcSupportLoader - Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Database ->
name : MySQL
version : 5.6.14
major : 5
minor : 6
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Driver ->
name : MySQL-AB JDBC Driver
version : mysql-connector-java-5.1.16 ( Revision: ${bzr.revision-id} )
major : 5
minor : 1
14-07-06 12:38:15,934 [INFO] org.hibernate.transaction.TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
14-07-06 12:38:15,934 [INFO] org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - JDBC batch size: 15
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - JDBC batch updates for versioned data: disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): enabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Connection release mode: auto
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Maximum outer join fetch depth: 2
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
14-07-06 12:38:15,934 [INFO] org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Query language substitutions: {false=0, true=1}
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: enabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Query cache: disabled
14-07-06 12:38:15,934 [INFO] org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory
14-07-06 12:38:15,950 [INFO] org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
14-07-06 12:38:15,950 [INFO] org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
14-07-06 12:38:15,951 [INFO] org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
14-07-06 12:38:15,951 [INFO] org.hibernate.cfg.SettingsFactory - Statistics: disabled
14-07-06 12:38:15,951 [INFO] org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
14-07-06 12:38:15,951 [INFO] org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
14-07-06 12:38:15,951 [INFO] org.hibernate.cfg.SettingsFactory - Named query checking : enabled
14-07-06 12:38:15,951 [INFO] org.hibernate.cfg.SettingsFactory - Check Nullability in Core (should be disabled when Bean Validation is on): disabled
14-07-06 12:38:15,966 [INFO] org.hibernate.impl.SessionFactoryImpl - building session factory
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [characters_clob] overrides previous : org.hibernate.type.PrimitiveCharacterArrayClobType@37d02753
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [blob] overrides previous : org.hibernate.type.BlobType@42c5d6c5
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [java.sql.Blob] overrides previous : org.hibernate.type.BlobType@42c5d6c5
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [clob] overrides previous : org.hibernate.type.ClobType@4a9741c2
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [java.sql.Clob] overrides previous : org.hibernate.type.ClobType@4a9741c2
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [materialized_blob] overrides previous : org.hibernate.type.MaterializedBlobType@105e4dd0
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [wrapper_materialized_blob] overrides previous : org.hibernate.type.WrappedMaterializedBlobType@1f469b15
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [wrapper_characters_clob] overrides previous : org.hibernate.type.CharacterArrayClobType@546f8fbd
14-07-06 12:38:15,966 [INFO] org.hibernate.type.BasicTypeRegistry - Type registration [materialized_clob] overrides previous : org.hibernate.type.MaterializedClobType@6845ec99
14-07-06 12:38:16,122 [INFO] org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
14-07-06 12:38:16,122 [INFO] org.hibernate.tool.hbm2ddl.SchemaUpdate - Running hbm2ddl schema update
14-07-06 12:38:16,122 [INFO] org.hibernate.tool.hbm2ddl.SchemaUpdate - fetching database metadata
14-07-06 12:38:16,122 [INFO] org.hibernate.tool.hbm2ddl.SchemaUpdate - updating schema
14-07-06 12:38:16,154 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - table found: livraria.arquivo
14-07-06 12:38:16,154 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - columns: [id, datamodificacao, conteudo, nome, contenttype]
14-07-06 12:38:16,154 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - foreign keys: []
14-07-06 12:38:16,154 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - indexes: [primary]
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - table found: livraria.livro
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - columns: [id, titulo, preco, datapublicacao, isbn, capa, descricao]
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - foreign keys: []
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - indexes: [isbn, primary]
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - table found: livraria.usuario
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - columns: [id, admin, nome, login, senha]
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - foreign keys: []
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.TableMetadata - indexes: [primary]
14-07-06 12:38:16,169 [INFO] org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete
14-07-06 12:38:16,216 [INFO] br.com.caelum.vraptor.view.LinkToHandler - Registering linkTo component
Jul 06, 2014 12:38:16 PM org.apache.catalina.core.StandardContext filterStart
SEVERE: Exception starting filter vraptor
com.google.inject.CreationException: Guice creation errors:

  1. Error in custom provider, java.lang.NullPointerException
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
    while locating br.com.caelum.vraptor.http.FormatResolver
    for parameter 0 at br.com.casadocodigo.livraria.vraptor.CustomPathResolver.(CustomPathResolver.java:13)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
    while locating br.com.casadocodigo.livraria.vraptor.CustomPathResolver
    Caused by: java.lang.NullPointerException
    at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.getName(AbstractScope.java:87)
    at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:67)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.Scopes$1$1.get(Scopes.java:65)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:204)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:198)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:198)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:179)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:83)
    at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
    at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

  2. Error in custom provider, java.lang.NullPointerException
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
    while locating br.com.caelum.vraptor.http.FormatResolver
    for parameter 0 at br.com.casadocodigo.livraria.vraptor.CustomPathResolver.(CustomPathResolver.java:13)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
    while locating br.com.casadocodigo.livraria.vraptor.CustomPathResolver
    while locating br.com.caelum.vraptor.view.DefaultPathResolver
    Caused by: java.lang.NullPointerException
    at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.getName(AbstractScope.java:87)
    at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:67)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.Scopes$1$1.get(Scopes.java:65)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:204)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:198)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:198)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:179)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:83)
    at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
    at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

  3. Error in custom provider, java.lang.NullPointerException
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
    while locating br.com.caelum.vraptor.http.FormatResolver
    for parameter 0 at br.com.casadocodigo.livraria.vraptor.CustomPathResolver.(CustomPathResolver.java:13)
    at br.com.caelum.vraptor.ioc.guice.GuiceComponentRegistry.bindToConstructor(GuiceComponentRegistry.java:151)
    while locating br.com.casadocodigo.livraria.vraptor.CustomPathResolver
    while locating br.com.caelum.vraptor.view.PathResolver
    Caused by: java.lang.NullPointerException
    at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.getName(AbstractScope.java:87)
    at br.com.caelum.vraptor.ioc.guice.AbstractScope$ScopedProvider.get(AbstractScope.java:67)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38)
    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62)
    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84)
    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031)
    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40)
    at com.google.inject.Scopes$1$1.get(Scopes.java:65)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40)
    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:204)
    at com.google.inject.internal.InternalInjectorCreator$1.call(InternalInjectorCreator.java:198)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024)
    at com.google.inject.internal.InternalInjectorCreator.loadEagerSingletons(InternalInjectorCreator.java:198)
    at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:179)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:83)
    at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
    at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
    at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

3 errors
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:183)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:83)
at br.com.caelum.vraptor.ioc.guice.GuiceProvider.start(GuiceProvider.java:97)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108)
at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:103)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)

Jul 06, 2014 12:38:16 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error filterStart
Jul 06, 2014 12:38:16 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/livraria-admin] startup failed due to previous errors
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/livraria-admin] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/livraria-admin] appears to have started a thread named [com.google.inject.internal.util.$Finalizer] but has failed to stop it. This is very likely to create a memory leak.
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/livraria-admin] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/livraria-admin] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak.
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/livraria-admin] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1] but has failed to stop it. This is very likely to create a memory leak.
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/livraria-admin] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] but has failed to stop it. This is very likely to create a memory leak.
Jul 06, 2014 12:38:16 PM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
SEVERE: The web application [/livraria-admin] created a ThreadLocal with key of type [com.google.inject.internal.InjectorImpl$1] (value [com.google.inject.internal.InjectorImpl$1@34f89046]) and a value of type [java.lang.Object[]] (value [[Ljava.lang.Object;@2ac7fed5]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
14-07-06 12:38:16,997 [INFO] br.com.caelum.vraptor.config.BasicConfiguration - Using class br.com.caelum.vraptor.ioc.guice.GuiceProvider as Container Provider
14-07-06 12:38:17,669 [INFO] br.com.caelum.vraptor.config.BasicConfiguration - br.com.caelum.vraptor.scanning = null
14-07-06 12:38:17,669 [INFO] br.com.caelum.vraptor.scan.WebAppBootstrapFactory - Dynamic WebAppBootstrap found.
14-07-06 12:38:17,716 [ERROR] br.com.caelum.vraptor.scan.ScannotationComponentScanner - There’s no occurence of package br.com.caelum.vraptor.util.jpa in classpath
14-07-06 12:38:17,825 [INFO] br.com.caelum.vraptor.core.DefaultConverters - Registering bundled converters
14-07-06 12:38:17,840 [INFO] br.com.caelum.vraptor.view.LinkToHandler - Registering linkTo component
14-07-06 12:38:17,872 [INFO] br.com.caelum.vraptor.VRaptor - VRaptor 3.5.0 successfuly initialized
Jul 06, 2014 12:38:17 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [“http-bio-8080”]
Jul 06, 2014 12:38:17 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [“ajp-bio-8009”]
Jul 06, 2014 12:38:17 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 5957 ms
Jul 06, 2014 12:39:55 PM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1481)
at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:1964)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)

Exception in thread “Timer-0” java.lang.NoClassDefFoundError: com/mchange/v2/resourcepool/BasicResourcePool$AsyncTestIdleResourceTask
at com.mchange.v2.resourcepool.BasicResourcePool.checkIdleResources(BasicResourcePool.java:1481)
at com.mchange.v2.resourcepool.BasicResourcePool.access$2000(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$CheckIdleResourcesTask.run(BasicResourcePool.java:1964)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.resourcepool.BasicResourcePool$AsyncTestIdleResourceTask
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
… 5 more

Pode tirar o @ApplicationScoped… é pq o FormatResolver é Request scoped.

No exemplo de livraria-site, foi criada sua homepage através de HomeController.java com o método inicio() e, também, a pasta home com a página inicio.jsp. Mas como é que eu faço para tornar inicio.jsp a página eletiva a ser carregada quando acesso http://localhost:8080/livraria-site/ ?

a regra da onde vai ficar o jsp só depende do controller, não da URL final… por exemplo:

@Controller // ou @Resource no VR3
public class HomeController {
   @Get("/")
   public void inicio() {...}
}

a URL é a que vc falou, e o jsp ainda assim vai estar em WEB-INF/jsp/home/inicio.jsp

Lucas,

Isso eu já sabia, mas pensei que pudesse ter uma outra maneira.

O problema que estou enfrentando com o site é com relação ao endereçamento da pasta imagens no atributo src da tag img. Se eu coloco “/” no path do controller da página de início e se minhas outras páginas ficam com paths em outro nível, por exemplo, com path “/produtos” ou /produtos/novo", muda a localização em relação a minha pasta imagens.

<img class=“imgMarca” src="<c:url value=“imagens/logo.jpg”/>" alt=“logo tryon”>

Se coloco o caminho das imagens de acordo com a página inicial, não vai funcionar para as outras páginas por causa dos diferentes níveis do “path” configurado nos seus controllers. Ou seja, se colocar o endereçamento do logo conforme o exemplo acima para a página inicio, a imagem do logo aparece para a página inicial (configurada com path “/” no método do controller), mas não vai aparecer para as outras (ex: configuradas com path “produtos/”, “produtos/novo”, etc. nos seus métodos no controller).

O que fazer? Por causa disso, estou tendo que trabalhar com todas as páginas configuradas nos seus métodos com path no mesmo nível “/home/inicio”, “produtos/lista”, “produtos/novo”, etc… E com isso, não consigo configurar a página inicial com path “/” para que acessando o site essa seja carregada.

Lucas,

Consegui resolver o problema com endereçamento relativo tanto para imagens como para css usando:

logo tryon

vc também poderia usar o <c:url começando com /:

<c:url value="/imagens/logo.jpg"/>

Lucas,

Não estou conseguindo que funcione a funcionalidade de redirecionar do método lista para o método listaAnel usando a lógica do código abaixo. O VRaptor diz que não existe lista.jsp na pasta produtos. Mas eu usei essa lógica de forma idêntica ao exemplo do método edita em relação ao método formulario de LivrosController no exemplo de livraria-admin, com exceção de result.include(livroEncontrado). O que está faltando na minha lógica? Quero que exista listaAnel.jsp dentro da pasta produtos, mas que não exista lista.jsp dentro da pasta produtos. Outra dúvida, como é que eu faço para passar um parâmetro enum? Por exemplo, quando passo uma String é “http://localhost:8080//produtos/ANEL” e dentro do jsp é “${linkTo[ProdutosController].lista[‘ANEL’]}”. Como seria para um tipo enum?


package br.com.casadocodigo.livraria.admin.controlador;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class ProdutosController {

private final Result result;

public ProdutosController(Result result) {
	this.result = result;
}

@Get
@Path(value = "/produtos/listaAnel", priority = Path.HIGH)
public void listaAnel() {
	
}

@Get
@Path(value = "/produtos/{categoria}", priority = Path.LOWEST)
public void lista(String categoria) {
	
	if (categoria == "ANEL") {
		result.of(this).listaAnel();
	}
	
}

}

se o intuito é não mostrar nada se a categoria for diferente de anel, vc pode fazer:

if (categoria == "ANEL") { 
   result.of(this).listaAnel(); 
} else {
   result.notFound();
}

PS: coloque o código entre e

Lucas,

Não está funcionando. Existe listaAnel.jsp dentro da pasta produtos, que fica dentro da pasta jsp. Quando executo http://localhost:8080/livraria-admin/produtos/listaAnel funciona, mas quando executo http://localhost:8080/livraria-admin/produtos/ANEL recebo uma página 404 com a mensagem “The requested resource is not available”.

package br.com.casadocodigo.livraria.admin.controlador;

import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;

@Resource
public class ProdutosController {

	private final Result result;
	
	public ProdutosController(Result result) {
		this.result = result;
	}

	@Get
	@Path(value = "/produtos/listaAnel", priority = Path.HIGH)
	public void listaAnel() {
		
	}

	@Get 
	@Path(value = "/produtos/{categoria}", priority = Path.LOWEST) 
	public void lista(String categoria) { 

		if (categoria == "ANEL") {   
			   result.of(this).listaAnel();   
		} else {  
			   result.notFound();  
		}  

	} 
	
}

Lucas,

No exemplo de upload/download de arquivos do livro do VRaptor 3, gostaria de saber como resolver os seguintes problemas:

  1. Quando na lista de livros, com a imagem visualizada para cada livro, resolvo modificar os dados de um livro, selecionando o link “Modificar”, que leva para o formulário que carrega todos os campos com os dados do livro, gostaria que se não escolhesse uma outra imagem para o livro a partir do campo input file e se já houvesse uma imagem desse livro gravada no banco, essa permanecesse no banco, ou seja, fossem persistidos todos os dados do livro no formulário, com exceção do campo do input file referente a imagem. Pois como ficou o código sugerido pelo livro, quando resolvo modificar (editar) qualquer dado do livro, se não carrego nenhuma imagem a partir do campo input file e salvo, perco a imagem anteriormente gravada no banco e gravo null em seu lugar. O que fazer para não persistir o campo input file, caso não tenha carregado uma outra imagem nele?

  2. Outra coisa, como poderia carregar uma pré-visualização da imagem no próprio formulário do livro, logo depois que escolho a imagem a partir do campo input file, mas antes de apertar o botão salvar e gravar a imagem no banco?

Lucas,

Já resolvi as funcionalidades com relação ao upload.

Só estou agora com uma pendência para finalizar o site de e-commerce para o trabalho da faculdade.

Aproveitei os códigos das classes CarrinhoController, Carrinho e Item do manual FJ28. Entretanto, a solução desse manual não usava JPA. Quando adaptei para usar, no método adiciona de CarrinhoController, a primeira linha do código antigo que tinha “dao.recarrega(item.getProduto());”, foi substituída por “estoque.recarrega(item.getProduto());”. Quando executo o método adiciona do CarrinhoController no caso de comprar um produto, dá erro com a seguinte mensagem na console: br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalArgumentException: Entity not managed. O que usar, então, nesse método para obter o produto para usar o seu preço no cálculo do total da compra do método adiciona da classe Carrinho, pois só está sendo passado o objeto item para o método adiciona do CarrinhoController. Seguem abaixo os códigos de CarrinhoController, Carrinho e JPAProdutoDAO.

Aguardo…

[code]package br.com.pf131.tryon.controlador;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.pf131.tryon.modelo.Carrinho;
import br.com.pf131.tryon.modelo.Estoque;
import br.com.pf131.tryon.modelo.Item;

@Resource
public class CarrinhoController {

private Carrinho carrinho;
private Estoque estoque;
private Result result;

public CarrinhoController(Carrinho carrinho,
		Estoque estoque, Result result) {
	this.carrinho = carrinho;
	this.estoque = estoque;
	this.result = result;
}

@Get("/carrinho")
public void visualiza() {
}

@Post("/carrinho")
public void adiciona(Item item) {
	estoque.recarrega(item.getProduto());
	carrinho.adiciona(item);
	result.redirectTo(this).visualiza();
}

@Delete("/carrinho/{indiceItem}")
public void remove(int indiceItem) {
	carrinho.remove(indiceItem);
	result.redirectTo(this).visualiza();
}

}

package br.com.pf131.tryon.modelo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class Carrinho {

private List<Item> itens = new ArrayList<Item>();
private BigDecimal total = BigDecimal.ZERO;

public Integer contem(Item item) {
	for (int i = 0; i < itens.size(); i++) {
		Item temp = itens.get(i);
		if( temp != null )
			if (temp.getProduto().getNome().equals(item.getProduto().getNome())) {
				return i;
			}
	}
	return null;
}

public void adiciona(Item item) {
	Integer indiceItem = this.contem(item);
	if (indiceItem == null) {
		itens.add(item);
	}	
	else {
		int quantidade = itens.get(indiceItem).getQuantidade();
		itens.get(indiceItem).setQuantidade(quantidade + 1);
	}
	total = total.add(item.getProduto().getPreco().multiply(BigDecimal.valueOf(item.getQuantidade().longValue())));
}

public void remove(int indiceItem) {
	Item removido = itens.remove(indiceItem);
	total = total.add(removido.getProduto().getPreco().multiply(BigDecimal.valueOf(removido.getQuantidade().longValue())));
}

public Integer getTotalDeItens() {
	return itens.size();
}

//getters e setters
public List<Item> getItens() {
	return itens;
}
public void setItens(List<Item> itens) {
	this.itens = itens;
}
public BigDecimal getTotal() {
	return total;
}
public void setTotal(BigDecimal total) {
	this.total = total;
}

}

package br.com.pf131.tryon.dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import br.com.caelum.vraptor.ioc.Component;
import br.com.pf131.tryon.modelo.Produto;

@Component
public class JPAProdutoDAO implements ProdutoDAO {

private final EntityManager manager;

public JPAProdutoDAO(EntityManager manager) {
	this.manager = manager;
}

@Override
public void adiciona(Produto produto) {
	//this.manager.getTransaction().begin();
	if (produto.getId() == null) {
		this.manager.persist(produto);
	} else {
		this.manager.merge(produto);
	}
	//this.manager.getTransaction().commit();
}

@Override
public List<Produto> todos() {
	return this.manager.createQuery("select p from Produto p", Produto.class)
			.getResultList();
}

@Override
public Produto buscaPorId(Long id) {
	try {
		return this.manager
				.createQuery("select p from Produto p where p.id = :id",
						Produto.class).setParameter("id", id)
				.getSingleResult();
	} catch (NoResultException e) {
		return null;
	}
}

@Override
public Produto buscaPorNome(String nome) {
	try {
		return this.manager
				.createQuery("select p from Produto p where p.nome = :nome",
						Produto.class).setParameter("nome", nome)
				.getSingleResult();
	} catch (NoResultException e) {
		return null;
	}
}

@Override
public List<Produto> buscaPorPalavraChave(String nome) {
	CriteriaBuilder builder = manager.getCriteriaBuilder();
	CriteriaQuery<Produto> query = builder.createQuery(Produto.class);
	Root<Produto> from = query.from(Produto.class);
	TypedQuery<Produto> typedQuery = manager.createQuery(
		    query.select(from )
		    .where( 
		    	builder.like(from.<String>get("nome"), "%"+nome+"%")
		    )
		    .orderBy(builder.asc(from.get("nome")))
		);
	List<Produto> results = typedQuery.getResultList();
	return results;
}

@Override
public List<Produto> buscaPorCategoria(String categoria) {
	try {
		return this.manager
				.createQuery("select p from Produto p where p.categoria = :categoria",
						Produto.class).setParameter("categoria", categoria)
				.getResultList();
	} catch (NoResultException e) {
		return null;
	}
}

@Override
public void remove(Produto produto) {
	//this.manager.getTransaction().begin();
	this.manager.remove(produto);
	//this.manager.getTransaction().commit();
}

@Override
public void recarrega(Produto produto) {
	this.manager.refresh(produto);
}

}

[/code]