---
title: Aceitando URLs com ou sem barra no final
---
# por Tomaz Lavieri, adaptado para VRaptor 4
Para quem teve dificuldade como eu em conseguir determinar urls como:
~~~
#!java
@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.
## Nota do editor
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.
~~~
#!java
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.controller.DefaultControllerNotFoundHandler;
import br.com.caelum.vraptor.controller.HttpMethod;
import br.com.caelum.vraptor.core.RequestInfo;
import br.com.caelum.vraptor.http.route.ControllerNotFoundException;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.view.Results;
@RequestScoped
@Specializes
public class Error404 extends DefaultControllerNotFoundHandler {
private final Router router;
private final Result result;
@Inject
public Error404(Router router, Result result) {
this.router = router;
this.result = result;
}
/**
* @deprecated CDI eyes only
*/
public Error404() {
this(null, null);
}
@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 (ControllerNotFoundException ex) {
super.couldntFind(requestInfo);
}
}
private void tryMovePermanentlyTo(RequestInfo requestInfo, String newUri) {
router.parse(newUri, HttpMethod.of(requestInfo.getRequest()),
requestInfo.getRequest());
result.use(Results.status()).movedPermanentlyTo(newUri);
}
}
~~~