Как переопределить сопоставление URL-адресов, выполняемое плагином в Grails 4?

В Grails 3.3 я использовал собственное расширение RestOauthController из плагина spring-security-rest: 2.0.0.M2, которое я переопределил в UrlMappings.groovy следующим образом:

"/oauth/access_token"(controller: "restOauthMy", action: "accessToken", method: "POST")

Однако после обновления до Grails 4 запрос POST к / oauth / access_token теперь ведет к исходному контроллеру, мой RestOauthMyController.accessToken() никогда не вызывается. Есть ли способ избавиться от исходного сопоставления URL-адресов? В более общем плане, что определяет приоритет конфликтующих сопоставлений URL-адресов в Grails?


person andysh    schedule 02.04.2021    source источник
comment
Есть ли причина, по которой вы хотите использовать веху плагина (spring-security-rest:2.0.0.M2)?   -  person Jeff Scott Brown    schedule 07.04.2021
comment
Нет веских причин для этого, вероятно, использовал рекомендацию в руководстве в то время. Но теперь я попробовал последнюю версию 3.0.0.RC1, и она вела себя идентично.   -  person andysh    schedule 13.04.2021


Ответы (2)


Я нашел функциональный обходной путь, добавив динамическое сопоставление URL-адресов в BootStrap.groovy:

def grailsUrlMappingsHolder

def init = {
    grailsUrlMappingsHolder.addMappings {
        "/oauth/access_token" (controller: "restOauthMy", action: "accessToken", method: "POST")
    }
}

Таким образом, кажется, что динамическое сопоставление имеет приоритет, и мой замещающий код выполняется.

Однако мне бы очень хотелось знать, как это сделать правильно.

person andysh    schedule 02.04.2021
comment
Вот почему я добавил это предложение и не принял его. Решение, которое я нашел, отвечает на вопрос частично, но не полностью, и я буду рад принять лучший ответ. - person andysh; 02.04.2021
comment
@ Джефф На самом деле он не отвечает на свой вопрос. По умолчанию Grails имеет тенденцию сопоставлять все контроллеры с помощью Rest Mapping, но (AFAIK) использует URLHandlerMapping для UrlMapping (во многом так же, как он сделал выше в INIT). Похоже, что URLHandlerMapping не сопоставляется с RestMappings, как это было в 3.0. Точно так же вы делаете это в spring -boot, но вам нужно делать это вручную, тогда как Grails раньше делал это за вас. Похоже, Grails делает все меньше и меньше. - person Orubel; 03.04.2021
comment
@Andysh Проверьте, есть ли плагин, обрабатывающий URLMapping, который может перезаписывать ваши правила. Это единственное, что я мог придумать. На этом этапе вам нужно будет разветвить код плагина, чтобы исправить это сопоставление. - person Orubel; 03.04.2021
comment
@Andysh еще один поздний момент ... ваш контроллер не может быть зарегистрирован как bean или не может быть найден. Таким образом, он может использовать то, что видит по умолчанию. Я предлагаю зарегистрировать ошибку, указав как можно больше информации. Наиболее вероятный сценарий состоит в том, что ваш контроллер может не отображаться, но если вы предоставите им доступ к своей кодовой базе и создадите несколько тестов, вы можете поймать их в хорошем настроении. - person Orubel; 03.04.2021
comment
@Orubel да плагин spring-security-rest отменяет мои сопоставления, это очевидно, также проверено с помощью отладчика. Мой контроллер загружен как bean-компонент правильно, включая отображение, как это также видно в отчете url-mappings-report (иначе мой трюк не сработал бы). Хотя отображение плагина является приоритетным, но не должно (с моей точки зрения). - person andysh; 06.04.2021
comment
@andysh да, вы правы, вы ДОЛЖНЫ иметь возможность переопределить плагин. Вот почему это ошибка. У вас, очевидно, есть ВРЕМЕННОЕ ИСПРАВЛЕНИЕ, но оно не является постоянным для проблем такого рода и НЕ является исправлением, которое они применяют и ожидают от сообщества в целом для плагинов. - person Orubel; 06.04.2021

Таким образом, при просмотре кода Grails 4.0 (и других плагинов) это оказывается ОЧЕНЬ ЖЕСТКОКОДИРОВАННОЙ конечной точкой, специфичной для spring -security-rest, поддержка которой была прекращена и введена внутри компании.

Так что, пока они не исправят свою проблему, у вас есть лучший способ ее решения. Тем не менее ... это ошибка, которую они еще не исправили, поскольку функциональность РАБОТАЛА в версии 3.0, когда spring-security-rest был отдельным плагином, а теперь он ЗАКРЕПЛЕН!

person Orubel    schedule 03.04.2021
comment
Мне кажется, это официальный файл сопоставления репо. Но я не вижу там ничего ненормального или жестко запрограммированного, плагинам разрешено определять свои сопоставления URL-адресов. Я просто не понимаю, почему следует запретить переопределение (и так было до Grails 4). Также где вы видите какие-либо намеки на прекращение производства? - person andysh; 06.04.2021
comment
Да ты прав. Это не было запрещено, пока они не принесли его недавно для версии 4.0 и не сделали небрежную перезапись для нее. Теперь это глючно. У них есть 3-4 человека, поддерживающих ВСЕ плагины сейчас, так что не ожидайте, что они исправят ошибки 4.0 в ближайшее время. Я бы посоветовал просто вернуться на 3.0, пока они не соберутся вместе - person Orubel; 06.04.2021