2017-08-14 8 views
1

En Vaadin j'ajouter des vues sur le navigateur via une chaîne comme ceci:Vaadin: Comment puis-je faire tous les cas urls fragment insensible

navigator.addView("myView", CustomClass.class); 

C'est sensible à la casse. Donc, cela fonctionne:

http://domain/#!myView 

Cela ne fonctionne pas:

http://domain/#!myview 

Je veux les deux urls de travailler et de préférence, il completly insensible à la casse. Je pourrais aussi ajouter la version minuscule, mais je préférerais une méthode plus propre qui fonctionne dans tous les cas. J'ai déjà des utilisateurs qui connaissent l'URL actuelle avec la lettre majuscule dedans.

Existe-t-il un moyen de configurer le navigateur, de sorte qu'il fonctionne d'une manière qui ignore le cas?

Répondre

1

Vous devez créer une nouvelle ViewProvider

import com.vaadin.navigator.View; 
import com.vaadin.navigator.ViewProvider; 

public class CaseInsensitiveClassBasedViewProvider implements ViewProvider { 

    private static final long serialVersionUID = 1L; 

    private String viewName; 
    private final Class<? extends View> viewClass; 

    public CaseInsensitiveClassBasedViewProvider(String viewName, Class<? extends View> viewClass) { 
     if (null == viewName || null == viewClass) { 
      throw new IllegalArgumentException(
        "View name and class should not be null"); 
     } 

     this.viewName = viewName; 
     this.viewClass = viewClass; 
    } 

    @Override 
    public String getViewName(String viewAndParameters) { 
     if (null == viewAndParameters) { 
      return null; 
     } 

     String viewAndParametersU = viewAndParameters.toUpperCase(); 
     String viewNameU = viewName.toUpperCase(); 

     if (viewAndParametersU.equals(viewNameU) || viewAndParametersU.startsWith(viewNameU + "/")) { 
      return viewName; 
     } 
     return null; 
    } 

    @Override 
    public View getView(String viewName) { 
     if (this.viewName.equalsIgnoreCase(viewName)) { 
      try { 
       View view = viewClass.newInstance(); 
       return view; 
      } catch (InstantiationException e) { 
       throw new RuntimeException(e); 
      } catch (IllegalAccessException e) { 
       throw new RuntimeException(e); 
      } 
     } 
     return null; 
    } 
} 

Et puis au lieu d'ajouter avec addView ajouter avec:

navigator.addProvider(new CaseInsensitiveClassBasedViewProvider("myView", CustomClass.class));