3

У меня есть контроллер, где работает нормально, он может регистрировать и обновлять сущность, а также как создавать формы для сохранения и обновления субъект, соответственноНастроить два @InitBinder для работы с одной и той же моделью или сущностью, но для разных @RequestMappings

@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){ 
    … 
} 

До сих пор у меня нет проблем.

Моя проблема заключается в @InitBinder

мне нужно работать с же лица Deportista (Sportsman), один специальной настройки для сохранения и обновления. Например

@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 
} 

Я прочитал следующее:

ссылки, упомянутые работы по разным entities, например User и Customer, это через @InitBinder's value атрибут, но мне нужно работать с одним и тем же объектом, ho w Я могу настроить @InitBinder's value, чтобы указать использование пружины или различать каждый @InitBinder? один для сохранения и обновления соответственно.

Благодаря

Edit: С ответе Serge Ballesta «s, следующий обязательно тоже:

@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"; 
} 

Это, чтобы работать свой ответ:

// 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){ 
    … 
} 

ответ

12

Согласно javadoc page for @InitBinder, вы можете использовать несколько init-binders в одном контроллере и специализировать их с именем переменной атрибута model, для которой они будут применяться. Пример:

@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 
} 

, а затем (XXX является тип объекта формы, который будет обрабатываться отправке)

// 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){ 
    … 
} 
+0

Большое спасибо! –

+1

Это работает для '@ ModelAttribute', но мои контроллеры аннотируются с помощью' @ RequestBody' вместо этого, который десериализует json для моего pojo и '@ requestbody', не дает аналогичного способа указать, какое связующее использовать. Есть ли решение, которое будет использоваться с @requestbody – mickeymoon

+0

Как я и искал, для \ @RequestBody используйте \ @InitBinder ("myclass"), а затем в сигнатуре метода: \ @RequestMapping (value = "view", params = "stuff = stuff") public void update (\ @ Valid \ @ModelAttribute MyClass o, результат BindingResult, ... и т. д. –

Смежные вопросы