VRaptor CookBook - URL com "/" e sem funcionando igual para os @Path

8 respostas
Lavieri

Para quem teve dificuldade como eu em conseguir determinar ursl como

@Path("produto/{produto.id}")

quando digitava a uri "/produto/1/" e o link não funcionava, segue abaixo uma modificação que corrige o problema.

import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.RequestInfo;
import br.com.caelum.vraptor.http.route.ResourceNotFoundException;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.resource.DefaultResourceNotFoundHandler;
import br.com.caelum.vraptor.resource.HttpMethod;
import br.com.caelum.vraptor.view.Results;

@Component
@RequestScoped
public class Error404 extends DefaultResourceNotFoundHandler  {
	private final Router router;
	private final Result result;
	public Error404(Router router, Result result) {
		this.router = router;
		this.result = result;
	}
	
	@Override
	public void couldntFind(RequestInfo requestInfo) {
		try {
			String uri = requestInfo.getRequestedUri();
			if (uri.endsWith("/")) {
				tryMovePermanentlyTo(requestInfo, uri.substring(0, uri.length()-1));
			} else {
				tryMovePermanentlyTo(requestInfo, uri + "/");
			}
		} catch (ResourceNotFoundException ex) {
			super.couldntFind(requestInfo);
		}
	}

	private void tryMovePermanentlyTo(RequestInfo requestInfo, String newUri) {
		router.parse(newUri, HttpMethod.of(requestInfo.getRequest()), requestInfo.getRequest());
		result.use(Results.http()).movedPermanentlyTo(newUri);
	}
}

8 Respostas

Lucas_Cavalcanti

Muito obrigado Lavieri!

Estou colocando no site =)

Lavieri

Eu é que agradeço o apoio da equipe da caelum e do vraptor!

e parafraseando o comentário na página do cookbook

“Isso não é necessariamente um problema… a URL /abc é diferente da /abc/ portanto o comportamento de dar 404 é o esperado. Mas se você quiser que sejam urls equivalentes você pode escrever a classe abaixo.”

G

Lavieri, muito bom.

Essa é a coisa boa do vraptor… você sempre consegue adaptar conforme a vontade e de forma bem simples.

G

Estranho, mas eu não tenho o método requestInfo.getRequestedUri();

Lucas_Cavalcanti

esse método foi adicionado na versão 3.0.2 =)

G

Poxa, eu fiz um fork um pouco antes de sair essa versão e fiquei obsoleto nele, hahahaha. Esse fork eu fiz para aquela correção do magic map, que aliás vou te mandar esse final de semana.

Abraços,

Lucas_Cavalcanti

para atualizar o seu fork, tente fazer:

git add remote caelum git://github.com/caelum/vraptor.git
git pull caelum master

talvez dê algum erro de merge, mas daí é só corrigir e commitar =)

pra mandar a correção é só clicar em pull request na página do seu fork no github
Obrigado =)

A

O comando que funcionou aqui (ao menos na versão do git que estou usando) para adicionar outro remoto é :
git remote add caelum git://github.com/caelum/vraptor.git

Criado 19 de novembro de 2009
Ultima resposta 23 de fev. de 2011
Respostas 8
Participantes 4