1

我一直在尝试在 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

任何指针都会有很大帮助

4

2 回答 2

0

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

于 2013-05-07T14:35:04.167 回答
0

更新

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

希望能帮助到你


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

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

如果 Spring MVC 不希望在找到 Controller 注释后立即使用 RequestMapping 注释(或默认为某些东西),那么你很高兴(Post Bean Definition 处理器或类似机制)......

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

于 2013-05-07T22:09:47.677 回答