How to create a default method in SpringMVC using annotations?

浪尽此生 提交于 2019-12-10 02:50:18

问题


I can't find a solution to this, and it's driving me crazy. I have @Controller mapped that responds to several methods using @RequestMapping. I'd like to tag one of those methods as default when nothing more specific is specified. For example:

@Controller
@RequestMapping("/user/*")
public class UserController {

   @RequestMapping("login")
   public String login( MapModel model ) {}

   @RequestMapping("logout")
   public String logout( MapModel model ) {}

   @RequestMapping("authenticate")
   public String authenticate( MapModel model ) {}
}

So /user/login -> login method, /user/logout -> logout, etc. I'd like to make it so that if someone goes to /user then it routes to one of these methods. However, I don't see anything on @RequestMapping that would allow me to specify one of these methods as a default handler. I also don't see any other annotations that might be used on the class either to do this. I'm beginning to suspect it doesn't exist.

I'm using Spring 2.5.6. Is this solved in 3.0.0? I might just hack Spring to make it work because it's tremendously annoying this isn't more straightforward.

Thanks in Advance.


回答1:


Take a look at this answer:

Spring MVC and annotated controllers issue

What if you annotate a method with:

@RequestMapping(method = RequestMethod.GET)

You can see an example here:

Spring 3.0 MVC + Hibernate : Simplified with Annotations – Tutorial

The same behavior can be seen here:

Spring Framework 3.0 MVC by Aaron Schram (look at page 21)




回答2:


Short answer: I do not know how to simply specify one method as default with a simple tag.

But there is this ...

I do not know in which version of Spring this was implemented, but you can provide multiple values to @RequestMapping in 3.1.2. So I do this:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(value = {"", "/", "/list"}, method = RequestMethod.GET)
    public String listUsers(ModelMap model) { }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public ModelAndView add(HttpServletRequest request, ModelMap model) { }

}

The following URLs then map to listUsers():

  • http://example.com/user
  • http://example.com/user/
  • http://example.com/user/list



回答3:


I would create one default method without RequestMapping's value in there. Please see method defaultCall() below. You can then simply call them with URL: [yourhostname]/user

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping(method = RequestMethod.GET)
    public String defaultCall( MapModel model ) {
        //Call the default method directly, or use the 'forward' String. Example:
        return authenticate( model );
    }

    @RequestMapping("login")
    public String login( MapModel model ) {}

    @RequestMapping("logout")
    public String logout( MapModel model ) {}

    @RequestMapping("authenticate")
    public String authenticate( MapModel model ) {}
}

Ref: Spring Framework Request Mapping




回答4:


Simply using @RequestMapping("**") on your default method should work. Any more specific mappings should still pick up their requests. I use this method for setting up default methods sometimes. Currently using Spring v4.3.8.RELEASE.



来源:https://stackoverflow.com/questions/3327682/how-to-create-a-default-method-in-springmvc-using-annotations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!