Vaadin: Как сделать все URL-адреса фрагментов нечувствительными к регистру

В Vaadin я добавляю представления в навигатор через строку следующим образом:

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

Это чувствительно к регистру. Итак, это работает:

http://domain/#!myView

Это не работает:

http://domain/#!myview

Я хочу, чтобы оба URL-адреса работали, и желательно сделать их полностью нечувствительными к регистру. Я мог бы пойти и добавить версию нижнего регистра, но я бы предпочел более чистый способ, который работает для всех случаев. У меня уже есть пользователи, которые знают текущий URL-адрес с заглавной буквой.

Есть ли способ настроить навигатор, чтобы он работал без учета регистра?


person BluE    schedule 14.08.2017    source источник


Ответы (1)


Вам нужно создать новый 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;
    }
}

А затем вместо добавления с помощью addView добавьте с помощью:

navigator.addProvider(new CaseInsensitiveClassBasedViewProvider("myView", CustomClass.class));
person Oleg    schedule 14.08.2017