[RESOLVIDO] Problema ao configurar VRaptor - projeto em andamento

Pessoal, estou seguindo a apostila da Caellum pra configurar o VRaptor, mas tem hora que eles vão direto demais ao assunto.

por exemplo, na apostila ensinam a criar um projeto novo, utilizando o guia deles. Como adapatar a um projeto já existente?

Pergunta importante: depois que passar todas as libs para minha pasta WEB-INF/lib, vou configurar o web.xml, blza.
Devo colocar todas as pastas que estão dentro da pasta do VRaptor no meu projeto?
Digo, meu pacote vai ficar:

br.com.meuprojeto.vraptor
  e dentro desse pacote TODAS aquelas pastas? (config, converter, core... resource)

Depois tenho q editar o pacote em cada classe, mudando cd br.com.caelum.vraptor pra br.com.meuprojeto.vraptor ?

Desculpa a falta de detalhes, mas é que to vazando do serviço e já cansei de procurar algo bem pra iniciante sobre o Vraptor, apesar de achar o tuto da Caellum bem iniciante, tem hora que eles acham que temos que adivinar as coisas :stuck_out_tongue:

Obrigado

Um projeto vraptor é como um projeto web normal, nada muda.

A única coisa que você precisa é anotar seus controllers com @Resource e seus componentes que precisam ser gerenciados pelo vraptor como @Component (seja ele um interceptor, um repository, business…).

[quote] Devo colocar todas as pastas que estão dentro da pasta do VRaptor no meu projeto?
e dentro desse pacote TODAS aquelas pastas? (config, converter, core… resource) [/quote]

Não, as coisas do vraptor está dentro do jar vraptor-xxx.jar e você apenas joga esse jar dentro do web-inf/lib.

:smiley:

Esses jar’s aki tbm tem que estar dentro da sua lib

vraptor-3.1.0\lib\mandatory…

Opa. Obrigado pelas resposta. Só de saber que só tenho que colocar os jars na pasta, que já estão, fico aliviado. Achava que tava faltando alguma coisa.

Amanha eu tento e posto aqui se deu tudo certinho, obrigado galera

Galera. Consegui configurar o VRaptor e já to fazendo uns testes.

Resta ainda uma dúvida. Todas minhas páginas JSP tem de estar agora, OBRIGATORIAMENTE dentro da pasta web/WEB-INF/jsp ?

Digo, como mudar isso, pra continuar com minha lógica de pastas e arquivos, já que o projeto está em andamento?
Aguardo resposta, e muito obrigado pela ajuda.

seufagner, mais uma vez obrigado pela dica.

Desculpa a ignorância, mas lá fala pra implementar a classe:

[code]@Component
public class CustomPathResolver extends DefaultPathResolver {

@Override
protected String getPrefix() {
    return "/pasta/raiz/";
}

@Override
protected String getExtension() {
    return "ftl"; // ou qualquer outra extensão
}

@Override
protected String extractControllerFromName(String baseName) {
    return //sua convenção aqui
           //ex.: Ao invés de redirecionar UserController para 'user'
           //você quer redirecionar para 'userResource'
           //ex.2: Se você sobrescreveu a conveção para nome dos Controllers para XXXResource
           //e quer continuar redirecionando para 'user' e não para 'userResource'
}

}[/code]

mas quem vai chamar a classe? onde? quando?

ps: devo somente mapeá-la no web.xml?

Obrigado novamente

EDIT: tinha essa dúvida mas já resolvi. Eu tenho é que chamar o “método” /pasta1/principal
agora aguar a solução da minha outra dúvida acima, obrigado

Tenho outra dúvida.

Meu mapeamento para web do meu projeto, antes de tentar adapatar o VRaptor, estava da seguinte forma:

- meu_projeto/pastas_web

se estou em meu_projeto/pasta_web_1 e quero ir para a pasta que está dentro do WEB-INF, cujo caminho é: jsp/pasta1/principal.jsp, como devo proceder?
Já tentei colocar …/, …/, …/…/…/ mas não dá. Como refazer esse caminho agora com parte do projeto somente utilizando o VRaptor?

Mais explicações é só falar, Obrigado

a.moraissoares, sobre sua dúvida de QUEM vai chamar a classe… bem, pense sempre que é por mágica, hehehehe.

A idéia do vraptor é mais ou menos assim, de você não precisar se preocupar com infraestrutura, e apenas cuidar do negócio da sua aplicação. Tudo no vraptor é baseado em configurações pré definidas. Mas nada impede de você sobrescrever as configurações padrão. E quando o vraptor é inicializado ele inicialmente carrega as configurações padrão, logo após varre todo seu projeto atrás de classes anotadas com @Component e verifica qual configuração esse componente sobrescreve, e assim essa configuração é alterada.

Um exemplo: o padrão para o vraptor fazer forward para os JSPs é /WEB-INF/jsp/NOME-DO-CONTROLLER.METODO.jsp. Só que em um projeto meu além de eu querer usar JSPX e também organizei os diretórios como MODULO/CONTROLLER.METODO. Quem cuida dessa configuração é a interface PathResolver, e a implementação padrão dele é DefaultPathResolver. O que eu fiz foi criar uma classe que implemente essa interface, sendo assim ao invés do vraptor usar a configuração padrão de DefaultPathResolver irá usar a minha JspxPathResolver.

[code]@Component
public class JspxPathResolver
implements PathResolver {

@Override
public String pathFor(ResourceMethod method) {
    final Class<?> clazz = method.getResource().getType();
    final String clazzName = clazz.getSimpleName();
    final Package pkg = clazz.getPackage();

    // tiles = /package.controller.path.tiles
    final StringBuilder s = new StringBuilder(60);
    s.append("/WEB-INF/jspx/");
    s.append(StringUtils.substringAfterLast(pkg.getName(), "."));
    s.append("/");
    s.append(StringUtils.substringBefore(clazzName, "Controller").toLowerCase());
    s.append(".");
    s.append(method.getMethod().getName().toLowerCase());
    s.append(".jspx");

    return s.toString();
}

}[/code]

Você entendeu? Abraços

complementando o que o garcia-jj falou, é o VRaptor quem vai chamar essa classe, toda vez que ele precisar decidir pra onde redirecionar qdo acabar de executar o método da sua lógica…

Vc não precisa mapear em lugar nenhum, basta anotar com @Component que o VRaptor vai usar a sua implementação…

isso acontece pra qualquer classe que implemente alguma interface interna do vraptor… no caso é a PathResolver

Obrigado pelas respostas.

Clareou bastante coisa aqui agora. Enfim, estou conseguindo já salvar dados no banco através de formulário e etc.
Um problema que estou enfrentando agora é que no meu formulário de cadastro de pessoas, tenho o cadastro que vai para tres tabelas diferentes.

Sendo assim, o cara tem q preencher NOME, USUARIO, EMAIL, SENHA que vão pra tabela USUARIO. E tem que preencher RUA, NUMERO, CEP, BAIRRO…etc que vão pra tabela ENDERECO, ou seja, os dados do formulário vão para 2 tabelas diferentes.

1 - A pergunta é, no meu método cadastra do controller, eu devo receber os 2 objetos assim né?:

2 - Qualquer campo no formulário que esteja com name semelhante a esses: endereco.rua e usuario.nome, vai ser relacionado com esses objeto sacima correto?

3 - Eu tenho que marcar UsuarioBean como @Entity, uma vez que UsuarioBean está totalmente no formato antigo do meu projeto, ou seja, com as consultas feitas no braço?

4 - Estou tentando utilizar o validator do VRaptor, tal como esse exemplo:

validator.checking(new Validations() {{ that(produto.getNome() != null && produto.getNome().length() >= 3, "produto.nome","nome.obrigatorio"); that(produto.getDescricao() != null && produto.getDescricao().length() <= 40, "produto.descricao", "descricao.obrigatoria"); that(produto.getPreco() != null && produto.getPreco() > 0.0, "produto.preco", "preco.positivo"); }}); dao.salva(produto); result.redirectTo(ProdutosController.class).lista();

Acontece que quanto tento fazer isso, ASSIM QUE importo a biblioteca import br.com.caelum.vraptor.validator.Validations;, aparece um erro no meu package:

The type org.hamcrest.Matcher cannot be resolved. It is indirectly referenced from required .class files

e pede pra que eu configura meu BuildPath. Afinal, o que devo configurar? Lembro que importei todas biblios tais quais a apostila me indicou.

5 - Pelo que vi, mesmo que eu implemente uma CustomPathResolver extendida da PathResolver, eu não vou conseguir trabalhar com minhas pastas no local antigo né? Ou seja, eu não vou poder ter minhas pastas do VRaptor no caminho web(ou WebContent)/equipe/jsp/usuario, ou ainda web/jsp/equipe/usuario, estou correto? Caso negativo, gostaria de um exemplo pra mudar minhas pastas para tal referencia que acabei de exemplificar.

A dúvida é enorme, me desculpem pelo post imenso, mas muito obrigado pela disposição.

o ideal é o UsuarioBean ter um campo endereço, e vc popular via “usuario.endereco.”, daí vc recebe só o usuario no método… mas assim funciona tb

isso

vc só deve marcá-lo com @Entity se vc for usar o Hibernate ou a JPA com essa classe

Adicione o jar hamcrest-all.jar que está no zip do vraptor na pasta lib/optional, no seu classpath

[quote=a.moraissoares]
5 - Pelo que vi, mesmo que eu implemente uma CustomPathResolver extendida da PathResolver, eu não vou conseguir trabalhar com minhas pastas no local antigo né? Ou seja, eu não vou poder ter minhas pastas do VRaptor no caminho web(ou WebContent)/equipe/jsp/usuario, ou ainda web/jsp/equipe/usuario, estou correto? Caso negativo, gostaria de um exemplo pra mudar minhas pastas para tal referencia que acabei de exemplificar.

A dúvida é enorme, me desculpem pelo post imenso, mas muito obrigado pela disposição. [/quote]
se vc implementar o CustomPathResolver e anotá-lo com @Component, ele vai usar a sua convenção…
pra ir pra pasta equipe/jsp/usuario dentro do seu webContent é só retornar “equipe/jsp/usuario” no método certo (getPrefix eu acho)

Galera. Show de bola. Tirei várias dúvidas em um único tópico.

Vou colocar resolvido aqui, mas caso surja mais alguma dúvida eu volto a perguntar por aqui, ok?

Obrigado a todos que responderam. Boa tarde :wink:

http://vraptor.caelum.com.br/documentacao/configuracoes-avancadas-sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/