Как в Grails реализованы сопоставления обработчиков?

Я пытался издеваться над соглашением Grails по парадигме конфигурации в приложении spring mvc, и мне сложно автоматизировать сопоставления обработчиков.

В общем у меня такой контроллер.

@Controller
@RequestMapping(value = {"/", "/contact"})
public class ContactController {

    @Autowired
    private ContactService contactService;

    @RequestMapping(value = {"/","/index"})
    public String listContacts(Map<String, Object> map){
        map.put("contact", new Contact());
        map.put("contactList", contactService.listContact());
        return "contact";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addContact(@ModelAttribute("contact")Contact contact, BindingResult result){

        contactService.addContact(contact);

        return "redirect:/contact/index";
    }

    @RequestMapping(value = "/delete/{contactId}", method = RequestMethod.GET)
    public String removeContact(@PathVariable("contactId")Long contactId){
        contactService.removeContact(contactId);
        return "redirect:/contact/index";
    }
}

Теперь я попробовал «ControllerClassNameHandlerMapping», но, похоже, у него есть ограничение с URL-адресом из трех частей.

В основном я хочу, чтобы все запросы автоматически сопоставлялись с соответствующим контроллером и действиями без использования @RequestMapping.

Любые указатели будут большим подспорьем


person vijay tyagi    schedule 07.05.2013    source источник


Ответы (2)


Это будет нелегко. Платформа Grails написала кучу ASTTransformers, где они вводят аннотации и другие свойства в класс, который является контроллером. Взгляните на исходный код grails-plugin-controllers, и вы сможете увидеть код в файлеcompile.web и посмотреть, что они делают. Также, если вы посмотрите на ControllersGrailsPlugin, вы увидите, что он просматривает каталог grails-app в родительской папке. Это будет не так просто сделать. Надеюсь это поможет

person allthenutsandbolts    schedule 07.05.2013

ОБНОВИТЬ

Выполнение преобразований AST через ASM в вашем случае, вероятно, является самым быстрым способом, может быть, этапом после компиляции?

Надеюсь, поможет


Это будет не так просто, но то, что вы хотите, скорее всего, выполнит следующее:

  • Напишите обработчик аннотаций (сканируйте путь к классам из загрузчика классов) для сбора аннотаций контроллеров и соответствующего класса.
  • Подключитесь к API Spring mvc, чтобы внедрить сопоставление запросов на основе ваших соглашений.
  • Затем вам также нужно будет собрать параметры метода для автоматического ввода pathVariables и т. д.

Если Spring MVC не предполагает играть с аннотацией RequestMapping, как только будет найдена аннотация Controller (или что-то по умолчанию), тогда все готово (процессоры Post Bean Definition или аналогичные механизмы)...

Не так просто, но вполне возможно...

person rimero    schedule 07.05.2013