Search code examples
javaspringspring-bootrequest-mapping

Get @RequestMapping value of different method in same controller


Using Spring Boot, I have a couple methods in my RegisterController which handles new user registration.

The createNewUser method is responsible for saving the new user to the database and sending a confirmation e-mail containing a link that has a unique token.

The confirmUser method handles processing the GET request for the confirmation link.

Is there a way for the createNewUser method to get the @RequestMapping value assigned to confirmUser? I'd like to use this value to generate the confirmation link instead of hard coding it.

// Process form input data
@RequestMapping(value = "/register", method = RequestMethod.POST)
public ModelAndView createNewUser(@Valid User user, BindingResult bindingResult) {

}

// Process confirmation link
// Link in confirmation e-mail will be /registerConfirmation?token=UUID
@RequestMapping(value="/registerConfirmation", method = RequestMethod.GET)
public ModelAndView confirmUser( @RequestParam("token") String token) {

}

Solution

  • I don't know of a way to get it from the @RequestMapping value but you have a couple of different options.

    Option 1: Create a constant for the mapping and use that which allows you to reference it in both methods.

    private final static String REGISTER_CONF_VAL = "/registerConfirmation";
    
    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public ModelAndView createNewUser(@Valid User user, BindingResult bindingResult) {
    
    }
    
    // Process confirmation link
    // Link in confirmation e-mail will be /registerConfirmation?token=UUID
    @RequestMapping(value=REGISTER_CONF_VAL, method = RequestMethod.GET)
    public ModelAndView confirmUser( @RequestParam("token") String token) {
    
    }
    

    Option 2: Less ideal, but if you add registerConfirmation to your config file, you can access it like:

    @RequestMapping(value="${register.conf.val}", method = RequestMethod.GET)
    public ModelAndView confirmUser( @RequestParam("token") String token) {
    
    }
    

    The reason this isn't ideal is because you probably don't want it to be different from environment to environment. That said, it would work.