3

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) {

}
A_B
  • 1,009
  • 3
  • 15
  • 37
  • Why dont you merge confirmUser service with createNewUser, which would apparently return confirmation response. – Pratik Ambani Mar 12 '17 at 03:41
  • @PratikAmbani Because confirmUser() should only get invoked when the user clicks on the confirmation link in the e-mail. The createNewUser() method is when they have successfully filled out the register form. – A_B Mar 12 '17 at 03:48
  • BTW it's not a good practice to change state on HTTP GET requests (I guess you update the user info in the DB to note that he's confirmed), so it would be a better practice to change your 'confirmUser' method to be HTTP POST. – Alon Segal Mar 12 '17 at 15:08
  • @AlonSegal good point...thanks – A_B Mar 12 '17 at 17:52

2 Answers2

3

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.

Gregg
  • 34,973
  • 19
  • 109
  • 214
0

If you need to generate the link based on user request, you can use the Path Variable in the controller. U can get the path variable and use some mechanism to validate the path as well.

Replace registerConfirmation with {registerConfirmation} and in the method, use @PathVariable annotation to get the path. Use the variable to check if the path is valid.

Naresh
  • 3,174
  • 1
  • 17
  • 22