【问题标题】:Configure two @InitBinder to work with the same Model or Entity but for different @RequestMappings配置两个@InitBinder 以使用相同的模型或实体,但用于不同的@RequestMappings
【发布时间】:2014-09-16 15:56:53
【问题描述】:

我有一个控制器,它可以正常工作,它可以注册和更新一个实体,下面将如何创建表单来分别保存和更新一个实体

@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

我需要使用 same 实体 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,例如UserCustomer,它通过@InitBinder's value 属性,但我需要使用相同的实体,我如何配置@InitBinder's value 来指示Spring使用或区分每个@InitBinder?一个分别用于保存和更新。

谢谢

编辑:从Serge Ballesta 的回答来看,以下也是强制性的:

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

【问题讨论】:

    标签: spring spring-mvc spring-3 spring-4 spring-mvc-initbinders


    【解决方案1】:

    根据javadoc page for @InitBinder,您可以在一个控制器中使用多个init-binder,并使用将应用它们的模型属性变量的名称来专门化它们。示例:

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

    【讨论】:

    • 这适用于@ModelAttribute,但我的控制器用@RequestBody 注释,而不是将json 反序列化到我的pojo 和@requestbody 没有提供类似的方式来指定使用哪个绑定器。是否有与@requestbody 一起使用的解决方案
    • 我也在搜索,对于 \@RequestBody,使用 \@InitBinder("myclass") 然后在方法签名中: \@RequestMapping(value="view", params="stuff= stuff") public void update(\@Valid \@ModelAttribute MyClass o, BindingResult 结果, ...等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2013-03-03
    • 2015-08-09
    • 1970-01-01
    相关资源
    最近更新 更多