Spring @initbinder не вызывается при показе формы => Customditors не определены

StackOverflow https://stackoverflow.com/questions/2638848

Вопрос

Я следую (упрощенный в костный) контроллер:

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

Это контроллер, который я быстро создал, чтобы проверить проблему, которую я имел с другим контроллером просмотра. Как вы можете видеть в контроллере, определяется пользовательский аппарат. В моем фактическом контроллере этот редактор работает нормально; При введении, например, 11/01/2010 в поле формы, это красиво преобразуется в дату редактором; Также при возврате к форме дата снова была красиво преобразована обратно в строку.

Тем не менее, когда я (как в TestController) хочу установить дату по умолчанию в форме, то это просто отображается дата .TOSTRING () в поле формы вместо использования возвращаемого значения из CustommDateeditor. После некоторой отладки я узнал, что мой метод INITBINDER не вызывается при запросе Method == Get. Это нормально?

Я уверен, что я мог бы обработать это, не используя

Спасибо за вашу помощь,
Stijn

Это было полезно?

Решение

использовать @ModelAttribute Чтобы установить домен перед пересылкой на страницу.

тщательно использовать new Когда вы имеете дело с Spring, он просто создаст новый экземпляр Object Oudle Spring Context, и вы не можете использовать любую пружинную способность (например, веб-привязку, Vavilation и т. Д.).

пример :

@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());

Другие советы

Я не уверен, но второй аргумент в методе RecenterCustomeditor установлен на NULL. Этот аргумент состоит в том, чтобы установить имя поля, с которым вы хотите связать редактор, поэтому я точно не знаю, что произойдет, когда он будет установлен на NULL. Если вы хотите использовать этот редактор со всеми полями определенного типа, он существует тот же метод без этого параметра:

public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)

Я бы попробовал с этим, хотя я не уверен, что это решит проблему.

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

Надеюсь, поможет.

Чтобы решить это, я сам следующую код в моем контроллере:



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


Мои проблемы были с моим классом «категории», не признанным, потому что @InitBinder не звонил. «Секрет» здесь было изменение моего метода «@requeptmapping», чтобы включить - в его прототипе - 2 параметра, которые мне не нужно:
@Modelattribute («категория») Категория категории,
Результат BindingResult.
Это решило все (я знаю, что это не волшебство, просто дым, зеркала и java-отражение - но я желаю, чтобы напечатанную и онлайн-литературу обрабатывало бы простые случаи использования, как это соответственно).

Вот соответствующий код в моем соответствующем файле JSP:



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

    />
        </form:select>
        </div>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top