Добавить сопоставление URL по требованию

В моем проекте Grails есть как минимум 20 контроллеров, каждый из которых имеет как минимум 4 метода, и он продолжает расти. Я решил аннотировать каждый метод следующим образом:

import enums.URLMapped

class HomeController {
    @URLMapped(url="/", alias="home")
    def landingPage() {
        render(view: "/index")
    }
}

Как я могу добавить это значение URL в URLMapping.groovy динамически? Я мог бы сделать что-то вроде:

import enums.URLMapped
import java.lang.reflect.Method
import org.apache.commons.lang.StringUtils
import org.codehaus.groovy.grails.commons.DefaultGrailsControllerClass
import org.codehaus.groovy.grails.commons.GrailsApplication

class UrlMappings {
    static mappings = {
        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }

        // My annotation crawler/parser
        for(DefaultGrailsControllerClass controller in GrailsApplication.getControllerClasses()) {
            for(Method method in controller.getClazz().getDeclaredMethods()) {
                if(!method.isSynthetic()) {
                    if(method.isAnnotationPresent(URLMapped.class)) {
                        URLMapped url  = method.getAnnotation(URLMapped.class)
                        name "${url.alias()}": "${url.url()}" {
                            action="${method.getName()}"
                            controller="${StringUtils.capitalize(controller.getClazz().getSimpleName().split(/Controller/).getAt(0)}"
                        }
                        /* What I want to achieve above is this static URL:
                            name home: "/" {
                                action="landingPage"
                                controller="Home"
                            }
                         */
                    }
                }
            }
        }
    }
}

Но проблема в том, что static mapping это замыкание, и вы не должны предполагать, что внутри него есть петля (?). Так как я могу добавить свой URL? Я всегда мог бы поместить все статические URL для всех наших ссылок здесь, это просто утомительно поддерживать.

1 ответ

Я настоятельно рекомендую вам избавиться от этой идеи с помощью аннотаций, но разделить ваш проект на несколько плагинов (каждый - отдельное приложение grails), связанных вместе с Gradle.

Некоторая полезная информация:

  1. https://docs.gradle.org/current/userguide/custom_plugins.html
  2. https://docs.gradle.org/current/userguide/multi_project_builds.html
Другие вопросы по тегам