Маршрут перезапуска - маршрут обгоняется другим маршрутом

Я столкнулся со странной проблемой маршрутизации в рестлете. Я использую Android.

Этот класс extends Router

Это мой код маршрутизации:

    this.attach("/contacts", contactListRestlet); // To list all contacts
    this.attach("/contacts/{uid}", contactRestlet); // To show details about a specific contact
    this.attach("/contacts/similar", similarRestlet, Template.MODE_EQUALS);
    this.attach("/contact/photo/{uid}", photoRestlet); // {uid} must correspond to a valid raw contact id
    this.attach("/contact/photo/{uid}/thumbnail", photoThumbnailRestlet);
    this.attach("/import/file", fileImportRestlet);
    this.attach("/echo", echoRestlet);
    this.attach("/echo/file", echoFileRestlet);
    this.attach("/import/vcard", importVcard);
    this.attach("/logout", logoutRestlet);

    final String ROOT_URI = "file:///android_asset";
    Application application = new Application() {  
        @Override  
        public Restlet createInboundRoot() {
            //ForAssets
            DirectoryForAssets d = new DirectoryForAssets(getContext(), ROOT_URI);
            d.setTargetClass(DirectoryResourceExtension.class);
            d.setAndroidContext(context);
            return d;  
        }  
    };
    this.attach("/editor", application, Template.MODE_STARTS_WITH);

таким образом, если я ударил ip:port/contacts/similar Меня всегда перенаправляют на /contacts restlet (contactRestlet) и не /contacts/similar restlet (similarRestlet) как я и ожидал.

Но если я изменю это на:

    this.attach("/contacts/similar", similarRestlet);
    this.attach("/contacts", contactListRestlet); // To list all contacts
    this.attach("/contacts/{uid}", contactRestlet); // To show details about a specific contact
    this.attach("/contact/photo/{uid}", photoRestlet); // {uid} must correspond to a valid raw contact id
    this.attach("/contact/photo/{uid}/thumbnail", photoThumbnailRestlet);
    this.attach("/import/file", fileImportRestlet);
    this.attach("/echo", echoRestlet);
    this.attach("/echo/file", echoFileRestlet);
    this.attach("/import/vcard", importVcard);
    this.attach("/logout", logoutRestlet);

    final String ROOT_URI = "file:///android_asset";
    Application application = new Application() {  
        @Override  
        public Restlet createInboundRoot() {
            //ForAssets
            DirectoryForAssets d = new DirectoryForAssets(getContext(), ROOT_URI);
            d.setTargetClass(DirectoryResourceExtension.class);
            d.setAndroidContext(context);
            return d;  
        }  
    };
    this.attach("/editor", application, Template.MODE_STARTS_WITH);

это работает! (Разница лишь в том, что подобный Restlet стоит первым, чем contactRestlet).

Может кто-нибудь объяснить мне, почему это поведение? Что я делаю неправильно?

2 ответа

Решение

По умолчанию маршрутизатор сопоставляет первое доступное совпадение, существуют другие режимы сопоставления, включая наилучшее совпадение. Это можно настроить, изменив setDefaultMatchingMode(int) См. Рестлет JavaDoc для получения дополнительной информации. В настоящее время на http://restlet.com/technical-resources/restlet-framework/javadocs/2.3/jse/api/org/restlet/routing/Router.html

"/contacts/{uid}"
"/contacts/similar"

Если у вас есть эта последовательность выше, она будет использовать {uid} и заполнять "хожие ", потому что она не может различить оба и использует" похожие "в качестве"uid".

Итак, когда вы говорите так:

"/contacts/similar"
"/contacts/{uid}"

Сначала он ловит слова "похожие", и если он не "похож", он использует эту часть в качестве идентификатора пользователя.

Другие вопросы по тегам