代码之家  ›  专栏  ›  技术社区  ›  Stijn Geukens

spring@initbinder在显示form=>未定义customeditors时未调用

  •  0
  • Stijn Geukens  · 技术社区  · 14 年前

    我有以下控制器(简化为Bone):

    @Controller  
    public class TestController  {
    
    @RequestMapping(value = "/test.htm", method = RequestMethod.GET)
    public String showForm(final ModelMap map) {
        final TestFilter filter = new TestFilter();
        filter.setStartDate(new Date(System.currentTimeMillis()));
        map.addAttribute("reportPerResourceForm", filter);
        return "test";
    }
    
    @InitBinder
    public void initBinder(final WebDataBinder binder) {
        binder.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
    }
    

    }

    JSP:

    <form:form commandName="reportPerResourceForm" id="reportForm">
        <form:input path="startDate" />
    </form:form>
    

    这是我快速创建的一个控制器,用于测试我在另一个视图控制器上遇到的问题。正如您在控制器中看到的,定义了一个customedateditor。在我的实际控制器中,这个编辑器运行良好;当您在表单字段中输入例如11/01/2010时,编辑器很好地将其转换为日期;当返回到表单时,日期再次很好地转换为字符串。

    但是,当我(在testcontroller中)想要在表单上设置一个默认日期时,它只会在表单字段中显示一个date.tostring(),而不是使用customdateeditor.getastext()返回的值!经过一些调试,我了解到当requestMethod==get时,不会调用initBinder方法。这正常吗?

    我相信我可以通过不使用

    谢谢你的帮助,
    斯泰恩

    3 回复  |  直到 13 年前
        1
  •  2
  •   Jeg Bagus    14 年前

    使用 @ModelAttribute 在转发到页之前设置域。

    小心使用 new 当您处理spring时,它将在spring上下文之外创建一个新的对象实例,并且您不能使用任何spring功能(例如web绑定、验证等)。

    例子:

    @RequestMapping(value = "/test.htm", method = RequestMethod.GET)
    public String showForm(@ModelAttribute yourDomain, final ModelMap map)
    

    在您的域中,您可以使用:

    @DateTimeFormat(pattern="dd/MM/yyyy")
    private Date balance = new Date(System.currentTimeMillis());
    
        2
  •  1
  •   Javi    14 年前

    我不确定,但是registercustomeditor方法中的第二个参数设置为空。此参数用于设置要与编辑器关联的字段名,因此我不知道设置为空时会发生什么情况。如果要将此编辑器与特定类型的所有字段一起使用,则存在同一个不带此参数的方法:

    public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)
    

    我会试试这个,虽然我不确定这个能不能解决问题。

    binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
    

    希望有帮助。

        3
  •  0
  •   Adam Weingarten    13 年前

    为了解决这个问题,我自己的控制器中有以下代码:

    
    
            @InitBinder
            public void initBinder(WebDataBinder binder) {
                binder.registerCustomEditor(Category.class, new CategoryEditor(categoryService));
            }
    
            @ModelAttribute("categoryList") // Populate reference-data (EG select-lists) in the view. (p. 390-
    
        391).
            public List<Category> populateCategoryList() {
                return categoryService.list();
            }
    
            // Note: without adding "BindingResult result" to the following prototype
            // (and preceding it with a @ModelAttribute("categoryList") -
            // my initBibder() method does not get called!
            // I discovered and added this hokum in response to the following links:
            // http://forum.springsource.org/showthread.php?46837-InitBinder-not-called
            // http://forum.springsource.org/showthread.php?46876-Custom-date-format-on-GET-requests&p=154820
            @RequestMapping("/site/list.htm")
            @ModelAttribute("sites")  // 20110819
            public ModelAndView listSite(
                    @ModelAttribute("category") Category category,
                    BindingResult result
                    )
            {
        //        List<Site> sites = siteService.list();
                List<Site> sites = new ArrayList<Site>(); // = siteService.list();
                return new ModelAndView("siteList", "sites", sites);
            }
        }
    
    
    

    我的问题是我的“category”类没有被识别,因为没有调用@initbinder。 这里的“秘密”是修改我的“@requestmapping”方法,在它的原型中包含-2个参数 我不需要:
    @模型属性(“类别”)类别类别,
    BindingResult结果
    这一切都解决了(我知道这不是魔术,只是烟雾,镜子和Java反射-但我希望 印刷的和在线的文献将适当地处理这样的简单用例)。

    下面是我对应的jsp文件中的相关代码:

    
    
            <div>
            Select a category: 
            <form:select path="category">
                        <form:options items="${categoryList}" itemValue="id" itemLabel="name" 
    
        />
            </form:select>
            </div>
    
    

    推荐文章