2009-12-29 7 views
0

J'ai installé Spring 3.0 avec des contrôleurs annotés et il trouve mon contrôleur et l'exécute comme il se doit quand je lui envoie une URL à partir d'un navigateur. Mais lors de la réécriture de l'URL avec un filtre exactement le même qui fonctionne dans le navigateur, je reçois No mapping found for HTTP request with URI [/test/lookup]. Le filtre est chargé par org.springframework.web.filter.DelegatingFilterProxy.servlet dispatcher ne trouve pas l'url réécrite dans le filtre

Qu'est-ce que j'ai manqué dans le filtre?

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
import org.springframework.stereotype.Component; 


@Component("urlLookupFilter") 
public class UrlLookupFilter implements Filter { 

    private class ModifiedRequest extends HttpServletRequestWrapper { 

     private String mRequestURI; 
     private String mQueryString; 

     public ModifiedRequest(HttpServletRequest request) { 
      super(request); 
     } 

     @Override 
     public String getRequestURI() { 
      return mRequestURI; 
     } 

     public void setRequestUri(String s) { 
      this.mRequestURI = s; 
     } 

     @Override 
     public String getQueryString() { 
      return mQueryString; 
     } 

     public void setQueryString(String s) { 
      this.mQueryString = s; 
     } 
    } 

    public void init(FilterConfig filterConfig) throws ServletException { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest oRequest = (HttpServletRequest) request; 

     if (oRequest.getRequestURI().endsWith("test")) { 
      ModifiedRequest mRequest = new ModifiedRequest(oRequest); 
      mRequest.setRequestUri(oRequest.getContextPath() + "/lookup"); 
      mRequest.setQueryString(oRequest.getRequestURI().substring(oRequest.getContextPath().length())); 
      chain.doFilter(mRequest, response); 
      return; 
     } 
     chain.doFilter(request, response); 
    } 

    public void destroy() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 
} 

Répondre

2

Comme je l'ai mentionné dans ma réponse à votre previous question, un peu plus-riding getRequestURI ne suffit pas, vous devez remplacer plusieurs différentes méthodes liées à la route dans la demande, tels que getPathInfo, getServletContextPath, etc., etc. Ce n'est vraiment pas une bonne idée, mais si vous voulez vraiment faire cela, vous devrez passer par la source Spring et trouver les méthodes de la requête qui sont utilisées pour faire le mapping, et assurez-vous que vous êtes sur- chevauchant celui-là.

+1

Merci. Je suis d'accord avec le fait que ce n'est vraiment pas une bonne idée. Si quelqu'un a la même idée brillante que moi à l'avenir, ne le faites pas! ;) –

Questions connexes