【问题标题】:How grails has implemented handler mappings?grails 是如何实现处理程序映射的?
【发布时间】:2013-05-07 12:47:31
【问题描述】:

我一直在尝试在 spring mvc 应用程序中模拟 grails 的约定优于配置范例,我发现很难自动化处理程序映射。

基本上我有一个这样的控制器。

@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”,但它似乎对三部分网址有限制。

我基本上希望所有请求都自动映射到适当的控制器和操作,而不使用@RequestMapping

任何指针都会有很大帮助

【问题讨论】:

    标签: grails spring-mvc controller mapping url-mapping


    【解决方案1】:

    这并不容易。 Grails 框架编写了一堆 ASTTransformer,它们将注释和其他属性注入到作为控制器的类中。查看 grails-plugin-controllers 的源代码,您可以在 compiler.web 下查看代码并了解它们在做什么。此外,如果您查看 ControllersGrailsPlugin,您会看到它正在监视父文件夹下的 grails-app 目录。不会那么容易做到的。希望这会有所帮助

    【讨论】:

      【解决方案2】:

      更新

      在您的情况下进行 AST 转换 via ASM 可能是最快的方法,也许是编译后步骤?

      希望对你有帮助


      不会那么简单,但您想要的可能会执行以下操作:

      • 编写注解处理器(从类加载器扫描类路径)以收集控制器注解和匹配类
      • 挂钩 Spring mvc API 以根据您的约定注入请求映射。
      • 那么您还需要收集方法参数以自动注入 pathVariables 等。

      如果 Spring MVC 不希望在找到 Controller 注释后立即使用 RequestMapping 注释(或默认为某些东西),那么您就可以开始了(Post Bean Definition 处理器或类似机制)...

      没那么简单,但绝对有可能……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 2012-07-21
        相关资源
        最近更新 更多