Dúvida VRaptor -> Representation

isso mesmo.

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%)
rake’s 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 http://github.com/caelum/
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]

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.

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…

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

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…

@Override
public URI grava(Arquivo arquivo) {
manager.persist(arquivo);
return URI.create(“bd://” + arquivo.getId());
}

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

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?

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?

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.

Estou usando o MySql v. 5.1.16…

Estranho…

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

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.

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

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

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

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.

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?

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.

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.

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.