Dúvida VRaptor -> Representation

58 respostas
E

Boa noite,

Estou estudando o vRaptor através da apostila FJ-28 da caelum, e achei a parte que fala de Representation meio vago, não entendi direito como usar, se algum puder ajudar.

Estou em dúvida nessa parte:

dai tenho meu autocomplete assim:

$("#busca").autocomplete(
								'<c:url value="/produtos/busca.json"/>',
								{
									dataType : "json",
									parse : function(produtos) {
										return $.map(produtos,
												function(produto) {
													return {
														data : produto,
														value : produto.nome,
														result : produto.nome
													};
												});
									},
									formatItem : function(produto) {
										return produto.nome + "("
												+ produto.preco + ")";
									}
								});

que antes chamava este método

@Get("/produtos/busca.json")
	public void buscaJson(String q) {
		result.use(Results.json()).withoutRoot().from(dao.busca(q))
				.exclude("id", "descricao").serialize();
	}

A dúvida é, o que exatamente tenho q mudar para que o autocomplete consiga receber o json? Como informar o content type?

Vlw

58 Respostas

Lucas_Cavalcanti

o representation é pra quando vc está usando REST, com um HttpClient onde vc consegue adicionar o header Accept com o tipo de representação que vc quer (ex. xml, json ou html)

o que vc quer está descrito aqui:
http://jqueryui.com/autocomplete/#remote-jsonp

clique em view source. Só troque o dataType pra json, e adapte o resto dos parametros do $.ajax pro que o controller espera receber. na função do success vc monta o result partir dos dados da lista

E

Ah valeu cara,

eu alterei o código assim dai voltou funcionar o autocomplete

$("#busca").autocomplete(
								'<c:url value="/produtos/busca?_format=json"/>',  // com o _format eu aviso que quero um json de volta
								{
									dataType : "json",
									parse : function(produtos) {
										
										produtos =  JSON.parse(JSON.stringify(produtos.list)); // e aqui eu tiro a raiz do json, creio que fosse possível formatar embaixo isso, mas ainda não manjo mto de javascript =/
								
										return $.map(produtos,
												function(produto) {
													return {
														data : produto,
														value : produto.nome,
														result : produto.nome
													};
												});
									},
									formatItem : function(produto) {
										return produto.nome + "("
												+ produto.preco + ")";
									}
								});

Agora to com outro problema, a busca normal q usa esse mesmo controle, porém retornando direto pra página não funciona, existe algum jeito de eu saber exatamente o nome da váriavel que o vraptor retorna?

por exemplo, esse método:

public void busca(String q) {
		result.include("nome", q);
		result.use(Results.representation())
		.from(dao.busca(q))
		.exclude("id", "descricao")
		.serialize();
		System.out.println(q);
		}

retorna o que para o jsp? ${produtos}, ${produto}, ${produtosList} ?

valeu!

Lucas_Cavalcanti

se vc usar o .from(dao.busca(q), “produtos”)… vai ser ${produtos}

E

então, eu começo digita no campo dai o autocomplete encontra e mostra as opçoes, dai eu pressiono Enter, ele vai pra respectiva jsp, porém eu tento apresentar os dados com ${produtos.nome}, e não aparece nada =/

alguma sugestão?

vlw

Lucas_Cavalcanti

se dao.busca(q) retorna uma lista, vc deveria iterar por ela, usando o <c:forEach

E

Ah, agora sim. Falha minha.

É que durante os testes ontem acabei tirando o segundo parametro do .from, dai não conseguia acha a váriavel, (agora deixei produtoList pra reutiliza a outra jsp que eu ja tenho pra listagem).
PS. Nesse caso deixando só “.from(dao.busca(q))” ele retornaria a variavel com qual nome?

public void busca(String q) {
		result.include("nome", q);
		result.use(Results.representation())
		.from(dao.busca(q), "produtoList")
		//.exclude("id", "descricao")
		.serialize();
		System.out.println(q);
		}

E finalmente só re-corrigindo o autocomplete ficou assim

$("#busca").autocomplete(
								//'<c:url value="/produtos/busca.json"/>',
								{
								
									dataType : "json",
									parse : function(produtos) {
										
										produtos =  JSON.parse(JSON.stringify(produtos.produtoList));
								
										return $.map(produtos,
												function(produto) {
													return {
														data : produto,
														value : produto.nome,
														result : produto.nome
													};
												});
									},
									formatItem : function(produto) {
										return produto.nome + "("
												+ produto.preco + ")";
									}
								});

Vlw, pelo apoio/paciência.

até;

Lucas_Cavalcanti

se vc não fala nada, o VRaptor usa o nome da classe do objeto que vc passou.

se vc passa um Produto, o nome da variavel como ${produto}, e o VRaptor faz isso com produto.getClass() pra pegar o nome da classe,

numa List, apesar da gente ver esse , se vc faz lista.getClass() ele retorna só List, então a variável vai ser só ${list}

E

entendi, vlw novamente =)

F

Sou novata em Java e VRaptor e estou estudando a apostila Desenv. Ágil para Web com VRaptor, Hibernate e AJAX.

Gostaria do exemplo completo do uso do método representation() no tópico 12.7. Lá na apostila só mostra o código do método busca no controller. Gostaria de saber o que devo atualizar no código de header.jsp e busca.jsp.

Lucas_Cavalcanti

Olá,

o representation() foi feito principalmente para se você está se comunicando com a aplicação sem ser com forms e links em um browser. Funciona tanto em chamadas ajax, como outros sistemas chamando o seu via HTTP.

Mas ele aceita HTML como representação também, então usar um form ou link normal também vai mostrar a página, desde que haja o JSP do método.

Conhece o livro de VRaptor? ele explica esse tipo de coisa com mais detalhes que a apostila:
http://www.casadocodigo.com.br/products/livro-vraptor

F

Obrigada Lucas, vou ver o livro para ir mais a fundo. Outro ponto, pensei que no curso fj-28 abordasse DAO genérica na implementação do exemplo, mas até esse ponto da minha leitura não foi feito e acho que não faz. No livro de VRaptor explica como se implementa DAO genérica com VRaptor?

Lucas_Cavalcanti

Não aborda, porque não considero DAO genérica como uma boa prática. Ele força que todas as entidades possuam todas as operações do CRUD, o que nem sempre é verdade. Algumas não podem ser alteradas, outras não podem ser removidas, etc…

Mas se vc criar a DAO genérica e receber no construtor de uma classe DAO, ele vai injetar pra você normalmente.

se você tiver classes filhas de DAO, vc precisa que o DAO não seja @Component, mas só as filhas sejam.

F

Lucas,

Já havia lido algo a respeito sobre o uso de DAO genérica no caso da entidade não usar todas as operações do CRUD. Vou repensar o uso de DAO genérica no meu trabalho…

Não uso o framework Spring nas minhas aplicações. Na aplicação da apostila estamos controlando as transações manualmente, abrindo e fechando-as dentro de alguns métodos do DAO. Mas se precisar fazer mais de uma operação dentro da mesma transação, como alterar o código da aplicação da apostila para permitir o controle desse tipo de transação. Você teria um exemplo de como deveria ficar o código da aplicação goodbuy?

Resumindo, qual seria a melhor forma de tratar transações com VRaptor para quem não usa Spring e não vai ter o Transaction Manager para controlar todas as transações de uma aplicação.

Lucas_Cavalcanti

você pode usar o plugin vraptor-jpa ou vraptor-hibernate, que cuidam das transações pra você automaticamente, iniciando e commitando as transações a cada request.

assim vc só recebe o EntityManager ou Session no construtor dos DAOS e não precisa das ComponentFactories que criam eles.


F

Obrigada pela dica. Vou usar então o plug-in vraptor-hibernate.

Comecei a testar o framework Velocity e logo de início no “Olá Mundo” levei um erro… Estou usando o VRaptor 3.5.1, o hibernate-distribution-3.6.4.Final e o Tomcat 7. Conforme solicitado na apostila do curso, baixei os zips velocity-1.7.zip e velocity-tools-2.0.zip (últimas versões). No velocity-1.7.zip copiei os jars velocity-1.7.jar e velocity-1.7-dep.jar. No velocity-tools-2.0.zip copie todos os jars da pasta lib. Seguem em anexo as imagens das bibliotecas instaladas no classpath do projeto, a configuração do Velocity feita no arquivo web.xml e a mensagem de erro recebida incluindo o trace do console quando executo http://localhost:�8083/goodbuy/olamundo.vm.

Estou com alguma incompatibilidade nas libraries? O que significa a mensagem de erro “java.lang.ClassNotFoundException: org.apache.velocity.tools.view.servlet.VelocityViewServlet”?

Lucas_Cavalcanti

tenta usar o velocity-tools 1.7 tb…

usar versões diferentes da mesma lib pode causar esse tipo de erro.

F

Lucas,

Usei o velocity-1.4.zip e o velocity-tools-1.4.zip, porque não existia o velocity-tools-1.7, e funcionou…

Baixei o vraptor-hibernate-vraptor3.zip do repositório https://github.com/caelum/vraptor-hibernate, pois no projeto goodbuy estava usando Hibernate 3.6.4. Como eu instalo o plug-in vraptor-hibernate no projeto goodbuy?

Qual a diferença entre os plug-in vraptor-hibernate-vraptor3.zip e vraptor-hibernate-vraptor-3.5.3.zip existentes no https://github.com/caelum/vraptor-hibernate?

Estou querendo usar versões mais atuais nas tecnologias usadas nos meus futuros sites. Quais versões não dão problema de compatibilidade e você sugere usar para:
? Hibernate - JBoss
? VRaptor - Caelum
? JSTL - Sun
? Tomcat - Apache
? MySQL - Sun
? JQuery - JQuery

Lucas_Cavalcanti

para VRaptor 3.x e hibernate 3.6.x, use o plugin vraptor-hibernate na versão 1.0.0

para VRaptor 4.x e hibernate 4.x, use o plugin vraptor-hibernate na versão mais nova, 4.0.0.Final

e para instalar o plugin, é só colocar o jar dele na pasta WEB-INF/lib, de preferência usando o maven ou outro gerenciador de dependencias pra fazer isso.

Se tá começando agora, sugiro começar com o VRaptor 4, Hibernate 4, que precisam do tomcat 7+

todas as outras bibliotecas que você listou vc pode usar qualquer versão, de preferência as últimas.

F

Estou com uma dúvida com relação ao uso do vraptor-hibernate no código do goodbuy.

Além de não precisar mais da classe CriadorDeSessionFactory, entendi que também não é mais necessária a classe CriadorDeSession, pois com o plugin do vraptor-hibernate uma Session é automaticamente aberta ao início da requisição e fechada ao final, bem como uma transação é aberta ao início da requisição e feito o commit ou rollback dela ao final.

Resumindo, para usar o componente, deleto as classes CriadorDeSessionFactory e CriadorDeSession, bastando então receber a Session no construtor do componente desejado e retirar as linhas com “Transaction tx = session.beginTransaction();” e “tx.commit();” dos métodos do componente. Estou certa?

Lucas_Cavalcanti

isso mesmo.

F

Estava testando a extensão vraptor-scaffold seguindo a orientação do livro para criar a aplicação livraria, mas na hora de baixar as dependências com o comando “ant resolve”, o “ant” não foi reconhecido. Veja no final da cópia do console apresentada abaixo. Por que não está reconhecendo o ant?

[b]Microsoft Windows [versão 6.1.7601]
Copyright © 2009 Microsoft Corporation. Todos os direitos reservados.

C:\Users\Herman>cd c:\tmp\rubygems-2.2.2

c:\Tmp\rubygems-2.2.2>setup.rb
RubyGems 2.2.2 installed
Installing ri documentation for rubygems-2.2.2

=== 2.2.1 / 2014-01-06

Bug fixes:

  • Platforms in the Gemfile.lock GEM section are now handled correctly. Bug
    #767 by Diego Viola.
  • RubyGems now displays which gem couldn’t be uninstalled from the home
    directory. Pull request #757 by Michal Papis.
  • Removed unused method Gem::Resolver#find_conflict_state. Pull request #759
    by Smit Shah.
  • Fixed installing gems from local files without dependencies. Issue #760 by
    Arash Mousavi, pull request #764 by Tim Moore.
  • Removed TODO about syntax that works in Ruby 1.8.7. Pull request #765 by
    Benjamin Fleischer.
  • Switched Gem.ruby_api_version to use RbConfig::CONFIG[‘ruby_version’] which
    has the same value but is overridable by packagers through
    –with-ruby-version= when configuring ruby. Bug #770 by Jeremy Evans.
  • RubyGems now prefers the bundler API for gem install to reduce HTTP
    requests. (This change was intended for RubyGems 2.2.0 but was missed.)
    This should address bug #762 by Dan Peterson and bug #766 by mipearson.
  • Added Gem::BasicSpecification#source_paths so documentation or analysis
    tools can work properly as require_paths no longer returns extension source
    directories. Bug #758 Vít Ondruch.
  • Gem.read_binary can read read-only files again. This caused file://
    repositories to stop working. Bug #761 by John Anderson.
  • Fixed specification file sorting for Ruby 1.8.7 compatibility. Pull
    request #763 by James Mead

=== 2.2.0 / 2013-12-26

Special thanks to Vít Ondruch and Michal Papis for testing and finding bugs in
RubyGems as it was prepared for the 2.2.0 release.

Major enhancements:

  • RubyGems can check for gem dependencies files (gem.deps.rb or Gemfile) when
    rubygems executables are started and uses the found dependencies. This
    means rake will work similar to bundle exec rake. To enable this set
    the RUBYGEMS_GEMDEPS environment variable to the location of your
    dependencies file.

    See Gem::use_gemdeps for further details.

  • A RubyGems directory may now be shared amongst multiple ruby versions. Upon
    activation RubyGems will automatically compile missing extensions for the
    current platform when the built objects are missing. Issue #596 by Michal
    Papis

    By default different platforms do not share gem install locations so this
    must be configured by setting GEM_HOME to a common directory. Some gems use
    fixed paths for requiring extensions and are not compatible with sharing gem
    directories.

    The default sharing location may be configured by RubyGems packagers through
    Gem.default_ext_dir_for. Pull Request #744 by Vít Ondruch.

Minor enhancements:

  • RubyGems checks the ‘allowed_push_host’ metadata value when pushing a gem to
    prevent an accidental push to a public repository (such as rubygems.org).
    If you have private gems you should set this value in your gem specification
    metadata. Pull request #603 by Seamus Abshere.
  • gem list now shows results for multiple arguments. Pull request #604 by
    Zach Rabinovich.
  • gem pristine --extensions will restore only gems with extensions. Issue
    #619 by Postmodern.
  • Gem::Specification#files is now sorted. Pull request #612 by Justin George.
  • For gem list and friends, “LOCAL” and “REMOTE” headers are omitted if
    only local or remote gem information is requested with --quiet. Pull
    request #615 by Michal Papis.
  • Added Gem::Specification#full_require_paths which is like require_paths, but
    returns a fully-qualified results. Pull request #632 by Vít Ondruch.
  • RubyGems now looks for the https_proxy environment variable for https://
    sources. RubyGems will fall back to http_proxy if there is no https_proxy.
    Issue #610 by mkristian.
  • RubyGems now creates directories in .gem files. Issue #631 by marksolaris.
  • RubyGems raises an exception when a specification includes its gem. Issue
    #623 by notEthan.
  • RubyGems now displays relevant release note information when updating
    RubyGems. Issue #647 by Trevor Wennblom.
  • Deprecated Gem::Installer::ExtensionBuildError in favor of
    Gem::Ext::BuildError. The old constant is an alias for the new constant.
  • When extensions are built the gem_make.out file is always written now, even
    on success. This will help with debugging bad builds that report success.
  • If a specification fails to validate RubyGems shows a link to the
    specification reference guide. Issue #656 by Markus Heiler.
  • When using gem install -g, RubyGems now detects the presence of an
    Isolate, Gemfile or gem.deps.rb file.
  • Added Gem::StubSpecification#stubbed? to help determine if a user should run
    gem pristine to speed up gem loading. Pull request #694 and #701 by Jon
    Leighton.
  • RubyGems now warns when a gem has a pessimistic version dependency that may
    be too strict.
  • RubyGems now warns when a gem has an open-ended dependency.
  • RubyGems now raises an exception when a dependency for a gem is defined
    twice.
  • Marked the license specification attribute as recommended. Pull request
    #713 by Benjamin Fleischer.
  • RubyGems uses io/console instead of stty when available. Pull request
    #740 by Nobuyoshi Nakada
  • Relaxed Gem.ruby tests for platforms that override where ruby lives. Pull
    Request #755 by strzibny.

Bug fixes:

  • RubyGems now returns an error status when any file given to gem which
    cannot be found. Ruby bug #9004 by Eugene Vilensky.
  • Fixed command escaping when building rake extensions. Pull request #721 by
    Dmitry Ratnikov.
  • Fixed uninstallation of gems when GEM_HOME is a relative directory. Issue
    #708 by Ryan Davis.
  • Default gems are now ignored by Gem::Validator#alien. Issue #717 by David
    Bahar.
  • Fixed typos in RubyGems. Pull requests #723, #725, #731 by Akira Matsuda,
    pull request #736 by Leo Gallucci, pull request #746 by DV Suresh.
  • RubyGems now holds exclusive locks on cached gem files to prevent incorrect
    updates. Pull Request #737 by Smit Shah
  • Improved speed of gem install --ignore-dependencies. Patch by Terence
    Lee.

RubyGems installed the following executables:
C:/langs/Ruby193/bin/gem

Ruby Interactive (ri) documentation was installed. ri is kind of like man
pages for ruby libraries. You may access it like this:
ri Classname
ri Classname.class_method
ri Classname#instance_method
If you do not wish to install this documentation in the future, use the
–no-document flag, or set it as the default in your ~/.gemrc file. See
’gem help env’ for details.

c:\Tmp\rubygems-2.2.2>cd c:\langs\ruby193

c:\langs\Ruby193>gem install vraptor-scaffold

Fetching: thor-0.14.6.gem (100%)

Successfully installed thor-0.14.6

Fetching: activesupport-3.0.1.gem (100%)

Successfully installed activesupport-3.0.1

Fetching: rake-0.9.2.gem (100%)

rakes executable rake conflicts with C:/langs/Ruby193/bin/rake

Overwrite the executable? [yN]  y

Successfully installed rake-0.9.2

Fetching: vraptor-scaffold-1.3.0.gem (100%)

Thank you for installing vraptor-scaffold. Please read <a href="http://github.com/caelum/">http://github.com/caelum/</a>

vraptor-scaffold/blob/master/README.textile for more information.

Successfully installed vraptor-scaffold-1.3.0

Installing ri documentation for activesupport-3.0.1

Installing ri documentation for rake-0.9.2

Installing ri documentation for thor-0.14.6

Installing ri documentation for vraptor-scaffold-1.3.0

4 gems installed

c:\langs\Ruby193>cd c:\users\herman\workspace

c:\Users\Herman\workspace>vraptor new livraria --package=br.com.casadocodigo.liv
raria
create
create .classpath
create .project
create .settings
create .settings/org.eclipse.jdt.core.prefs
create .settings/org.eclipse.wst.common.component
create .settings/org.eclipse.wst.common.project.facet.core.xml
create .settings/org.eclipse.wst.jsdt.ui.superType.container
create .settings/org.eclipse.wst.jsdt.ui.superType.name
create build.xml
create build.properties
create ivy.xml
create ivy-2.2.0.jar
create src/main/java
create src/main/java/br/com/casadocodigo/livraria/controllers
create src/main/java/br/com/casadocodigo/livraria/models
create src/main/java/br/com/casadocodigo/livraria/models/Entity.java
create src/main/java/br/com/casadocodigo/livraria/repositories
create src/main/java/br/com/casadocodigo/livraria/repositories/Repository
.java
create src/main/resources
create src/main/resources/hibernate.properties
create src/main/resources/log4j.properties
create src/main/resources/messages.properties
create src/main/resources/META-INF
create src/main/resources/META-INF/persistence.xml
create src/main/webapp
create src/main/webapp/WEB-INF/web.xml
create src/main/webapp/images
create src/main/webapp/index.jsp
create src/main/webapp/stylesheets/application.css
create src/main/webapp/stylesheets/scaffold.css
create src/main/webapp/javascripts/application.js
create src/main/webapp/javascripts/jquery.min.js
create src/main/webapp/META-INF/vraptor-scaffold.properties
create src/main/webapp/WEB-INF/decorators.xml
create src/main/webapp/WEB-INF/jsp/decorators/main.jsp
create src/main/webapp/WEB-INF/jsp/prelude.jspf
create src/test/java
create src/test/java/br/com/casadocodigo/livraria/controllers
create src/test/java/br/com/casadocodigo/livraria/models
create src/test/java/br/com/casadocodigo/livraria/repositories
create src/test/resources

c:\Users\Herman\workspace>cd livraria

c:\Users\Herman\workspace\livraria>ant resolve
’ant’ não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

c:\Users\Herman\workspace\livraria>ant
’ant’ não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

c:\Users\Herman\workspace\livraria>svn ivy
’svn’ não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

c:\Users\Herman\workspace\livraria>[/b]

F

Oi Lucas,

Esquece a dúvida da mensagem anterior. Eu não tinha o apache-ant instalado na minha máquina… Instalei e configurei as variáveis de ambiente e funcionou.

F

Lucas,

Na criação do projeto livraria através do vraptor-scaffold, o projeto no eclipse fica marcado com erro mesmo tendo configurado o jdk e o tomcat. Um dos erros está na biblioteca do jquery e o outro no Java Resources é desconhecido… Ver imagem no ambiente eclipse, em anexo. O que está errado? Já dei clean no projeto, mas não adiantou…

Lucas_Cavalcanti

você pode ignorar esse erro, não vai afetar o funcionamento da aplicação.

F

Estou seguindo o exemplo do projeto da livraria do livro do VRaptor, mas esbarrei no seguinte problema no método grava (vide abaixo) da classe DiretorioNoBD do capítulo de upload/download de arquivos. Após manager.persist(arquivo), o valor de arquivo.getId() retorna null. Consigo recuperar todos os outros atributos de arquivo, só o id volta null. Já pesquisei na internet e todos são unânimes em afirmar que logo após o persist é possível recuperar o id, que é gerado automaticamente. Por que não está funcionando aqui? Estou seguindo fielmente todos os códigos do livro e até esse capítulo tudo estava funcionando conforme mencionado no livro…

<a class="mention" href="/u/override">@Override</a>

public URI grava(Arquivo arquivo) {

manager.persist(arquivo);

return URI.create(“bd://” + arquivo.getId());

}
Lucas_Cavalcanti

o id dentro do Arquivo está anotado com @Id e @GeneratedValue?

F

Sim, coloquei a notação @GeneratedValue no campo id conforme está no código do livro. Tudo está funcionando no upgrade da capa. É gerado o registro na tabela arquivo com o campo id identado automaticamente, só que no campo capa do registro do livro grava bd://null. Estou usando vraptor 3.5.1, mysql 5.1.16 e hibernate 3.6.4.

Já li na internet sobre problema em fazer get do campo “autogenerated” logo após o persist e falam para configurar @GeneratedValue(strategy = GenerationType.TABLE) ou @GeneratedValue(strategy = GenerationType.SEQUENCE) ao invés de @GeneratedValue(strategy = GenerationType.IDENTITY) para conseguir recuperar esse campo logo após o persist. Dizem que se usar GenerationType.IDENTITY só consegue recuperar esse campo após fazer commit da transação. Será que está faltando tratar a transação do persist ou alguma outra configuração?

F

Lucas,

Funcionou tratando a transação:

@Override
public URI grava(Arquivo arquivo) {

manager.getTransaction().begin();
	manager.persist(arquivo);
	manager.getTransaction().commit();
	
	return URI.create("bd://" + arquivo.getId());
	
}

Se eu quiser usar o plug-in VRaptor JPA também devo retirar as linhas com “manager.getTransaction().begin();” e “manager.getTransaction().commit();” dos métodos com persist ou merge? O que mais devo retirar ou fazer se usar esse plug-in?

Lucas_Cavalcanti

todas as vezes que eu fiz esse tipo de código a entidade ganhou o id logo após o persist, mesmo antes do fim da transação.

Vc tá usando qual banco de dados? talvez seja por isso.

F

Estou usando o MySql v. 5.1.16…

Lucas_Cavalcanti

Estranho…

tente colocar o dialect do InnoDb no persistence.xml e recriar as tabelas. Sabe fazer isso?

F

Lucas,

Eu coloco essa configuração para gerar banco tipo Innodb (org.hibernate.dialect.MySQLInnoDBDialect) no hibernate.properties ou no persistence.xml? Porque o meu persistence.xml só está configurado para apontar o provedor “default”:

<?xml version="1.0" encoding="UTF-8"?>

<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
</persistence-unit>

Já o hibernate.properties está com todas as seguintes configurações de banco:
hibernate.connection.username=root
hibernate.connection.password=root123
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost/livraria
hibernate.hbm2ddl.auto=update
hibernate.query.substitutions=true=1, false=0
hibernate.show_sql=true
hibernate.format_sql=true

#DATASOURCE POOL CONFIGURATIONS
hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider
maxPoolSize=20
minPoolSize=3
initialPoolSize=3
timeout=25200
acquireIncrement=5
preferredTestQuery=select 1
idleConnectionTestPeriod=100

O interessante foi que depois que criei o interceptador transacional, ensinado no capítulo seguinte do livro, não precisei mais colocar comandos de controle de transação. Mas seria bom resolver esse problema, já que estou pensando em usar o plug-in vraptor jpa mais adiante.

F

Seguindo o livro do VRaptor, no capítulo “Melhorando a usabilidade da aplicação com AJAX” está dando erro na remoção do livro usando o script jquery ensinado. Segue, em anexo, a imagem do erro usando o debug do Google Chrome. Envio em anexo, também, o trecho do código em lista.jsp. O VRaptor não está aceitando o método http passado para o método remove de LivrosController… Onde está o erro? É difícil depurar jquery…

No LivrosController o trecho de código está:

@Delete("/livro/{isbn}")

public void remove(String isbn) {

Livro livro = estante.buscaPorIsbn(isbn);

estante.retira(livro);

result.nothing();

}
Lucas_Cavalcanti

se vc já tem o hibernate.properties, coloque a config lá…

se eu não me engano vc tem que usar o MySQL5InnoDBDialect

Lucas_Cavalcanti

se vc olhar no log de request ele tá fazendo um GET ao invés do POST com _method=delete

troque o type para post ao invés de POST.

F

Vou testar usar minúscula.

Mas aproveito para te perguntar outra coisa, estou pensando em usar o plug-in do jpa no exemplo da livraria, que implementei de acordo com os capítulos do livro. Devo deletar FabricaDeEntityManager.java e FabricaDeEntityManagerFactory.java da aplicação, além de TransacoesInterceptor.java e Transacional.java? Pelo que eu entendi o plug-in vai tratar o controle automático de transições e a abertura e fechamento do EntityManager, ok?

Só não entendi como convivo com as classes que não são de escopo de requisição, que de acordo com a explicação do plug-in no livro, devem receber um EntityManagerFactory no construtor e controlar a abertura e o fechamento do EntityManager manualmente. Nesse caso, devo continuar usando FabricaDeEntityManager.java e FabricaDeEntityManagerFactory.java, mas receber FabricaDeEntityManager no construtor dessas classes que não são de escopo de requisição (@SessionScoped e @ApplicationScoped)?

Finalmente, qual é a vantagem de usar jpa com hibernate ao invés de usar só hibernate?

Lucas_Cavalcanti

Sim, usando o plugin vraptor-jpa vc não precisa das Fabricas nem do Interceptor. o Transactional está suportado na última versão do plugin.
Ele vai abrir um EntityManager e uma transação a cada requisição, então vc não precisa se preocupar.

como ele faz isso, não vai ter EntityManager disponível fora de requisições. Mas vc pode só receber o EntityManagerFactory no construtor, não precisa das fábricas.

a vantagem de usar só a jpa é a integração com as outras especificações do java e servidores de aplicação.

F

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? Usando o vraptor-scaffold para criar a aplicação, ele cria automaticamente a aplicação com o vraptor 3.4.1. Consegui atualizar para o 3.5.1, mas quando atualizava para a versão 4.0.0 através do ivy e do ant resolve dava erro direto quando executava a aplicação no tomcat 7, parecia estar faltando alguma biblioteca .jar.

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.

Entendi como funciona o consumo dos dados do objeto livro em livraria-site obtidos do sistema livraria-admin através de serialização e deserialização de objeto usando o formato xml. Mas não entendi como fazer o caminho contrário, ou seja, como transferir os dados do pedido de compra (carrinho de compras + forma de pagamento) obtidos no livraria-site para serem persistidos em banco de dados no livraria-admin? Poderia me explicar como fazer isso? 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?

Obs: Consegui resolver o problema do jquery. O script jquery não estava funcionando, porque a referência da biblioteca jquery estava mal posicionada no main.js criado pelo sitemesh na criação de livraria-admin usando vraptor-scaffold. Estava posicionada dentro do body do html. Configurei dentro do head do html no main.js e o script então funcionou.

F

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? Usando o vraptor-scaffold para criar a aplicação, ele cria automaticamente a aplicação com o vraptor 3.4.1. Consegui atualizar para o 3.5.1, mas quando atualizava para a versão 4.0.0 através do ivy e do ant resolve dava erro direto quando executava a aplicação no tomcat 7, parecia estar faltando alguma biblioteca .jar.

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.

Entendi como funciona o consumo dos dados do objeto livro em livraria-site obtidos do sistema livraria-admin através de serialização e deserialização de objeto usando o formato xml. Mas não entendi como fazer o caminho contrário, ou seja, como transferir os dados do pedido de compra (carrinho de compras + forma de pagamento) obtidos no livraria-site para serem persistidos em banco de dados no livraria-admin? Poderia me explicar como fazer isso? 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?

Obs: Consegui resolver o problema do jquery. O script jquery não estava funcionando, porque a referência da biblioteca jquery estava mal posicionada no main.js criado pelo sitemesh na criação de livraria-admin usando vraptor-scaffold. Estava posicionada dentro do body do html. Configurei dentro do head do html no main.js e o script então funcionou.

Lucas_Cavalcanti

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?

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 =/

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.

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)

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?

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.

F

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

Lucas_Cavalcanti

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.
F

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

<a class="mention" href="/u/override">@Override</a>

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?

Lucas_Cavalcanti
  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.

F

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

<a class="mention" href="/u/override">@Override</a>

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???

Lucas_Cavalcanti

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.

F

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 - Theres 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=<strong><strong>, 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=</strong></strong>, 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 - Theres 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
Lucas_Cavalcanti

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

F

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/ ?

Lucas_Cavalcanti

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

F

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.

F

Lucas,

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

logo tryon

Lucas_Cavalcanti

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

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

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();
	}
	
}

}

Lucas_Cavalcanti

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

F

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();  
		}  

	} 
	
}
F

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?

F

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...

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);
	}
	
}
Criado 8 de janeiro de 2013
Ultima resposta 21 de jul. de 2014
Respostas 58
Participantes 3