Добавить сопоставление 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.
Некоторая полезная информация: