Set up two @InitBinder to work with the same model or entity, but for different @RequestMappings

I have a controller where it works fine, it can register and update the object, namely how to create the following forms to save and update the object.

@RequestMapping(value="/registrar.htm", method=RequestMethod.GET)
public String crearRegistrarFormulario(Model model){
}

@RequestMapping(value="/{id}/actualizar.htm", method=RequestMethod.GET)
public String crearActualizarFormulario(@PathVariable("id") String id, Model model){
}

      

So far, I haven't had any problems.

My problem is with @InitBinder

I need to work with the same object Deportista

(Sportsman), one of the special settings for saving and updating. for example

@InitBinder
public void registrarInitBinder(WebDataBinder binder) { // register or save
    logger.info(">>>>>>>> registrarInitBinder >>>>>>>>>>>>>");
    CustomDateEditor customDateEditor = new CustomDateEditor(...
}

@InitBinder
public void actualizarInitBinder(WebDataBinder binder) { // update
    logger.info(">>>>>>>> actualizarInitBinder >>>>>>>>>>>>>");
    CustomDateEditor customDateEditor = new CustomDateEditor(...
    binder.setDisallowedFields(…) //I need this only for update
}

      

I read the following:

The links mentioned work around different ones entities

like User

and Customer

via attribute @InitBinder value

, but I need to work with the same object, how can I configure @InitBinder value

to tell Spring to use or distinguish each @InitBinder

? one to save and update respectively.

thank

Edit: From the answer Serge Ballesta

, the following is also needed:

@Controller
@RequestMapping(value="/deportista")
@SessionAttributes(value={"deportistaRegistrar", "deportistaActualizar"})
public class DeportistaController {

@RequestMapping(value="/registrar.htm", method=RequestMethod.GET)
public String crearRegistrarFormulario(Model model){
    Deportista deportista = new Deportista();
    model.addAttribute("deportistaRegistrar", deportista);
    return "deportista.formulario.registro";
}

@RequestMapping(value="/{id}/actualizar.htm", method=RequestMethod.GET)
public String crearActualizarFormulario(@PathVariable("id") String id, Model model){
    Deportista deportista = this.fakeMultipleRepository.findDeportista(id);
    model.addAttribute("deportistaActualizar", deportista);
    return "deportista.formulario.actualizacion";
}   

      

To give him an answer:

// registrarInitBinder will be used here
@RequestMapping(value="/registrar.htm", method=RequestMethod.POST)
public String doCrearRegistrarFormulario(@ModelAttribute("deportistaRegistrar") XXX value,
    BindingResult result, Model model){
}

// actualizarInitBinder will be used here
@RequestMapping(value="/{id}/actualizar.htm", method=RequestMethod.POST)
public String crearActualizarFormulario(@PathVariable("id") String id,
    @ModelAttribute("deportistaActualizar") XXX value, BindingResult result, Model model){
}

      

+3


source to share


1 answer


According to the javadoc page for@InitBinder

, you can use multiple init-binders in one controller and specialize them with the name of the model attribute variable they will apply to. Example:

@InitBinder("saveValue")
public void registrarInitBinder(WebDataBinder binder) { // register or save
    logger.info(">>>>>>>> registrarInitBinder >>>>>>>>>>>>>");
    CustomDateEditor customDateEditor = new CustomDateEditor(...
}

@InitBinder("updateValue")
public void actualizarInitBinder(WebDataBinder binder) { // update
    logger.info(">>>>>>>> actualizarInitBinder >>>>>>>>>>>>>");
    CustomDateEditor customDateEditor = new CustomDateEditor(...
    binder.setDisallowedFields(…) //I need this only for update
}

      



and then (XXX is the type of form object that will be processed by the submit)

// registrarInitBinder will be used here
@RequestMapping(value="/registrar.htm", method=RequestMethod.POST)
public String doCrearRegistrarFormulario(@ModelAttribute("saveValue") XXX value,
    BindingResult result, Model model){
}

// actualizarInitBinder will be used here
@RequestMapping(value="/{id}/actualizar.htm", method=RequestMethod.POST)
public String crearActualizarFormulario(@PathVariable("id") String id,
    @ModelAttribute("updateValue") XXX value, BindingResult result, Model model){
}

      

+12


source







All Articles