Question

Je suit (simplifié à l'os) Contrôleur:

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

}

Le jsp:

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

Ceci est un contrôleur je me suis vite créé pour tester une question que j'avais une autre vue-contrôleur. Comme vous pouvez le voir dans le contrôleur un CustomeDateEditor est défini. Dans mon contrôleur réelle de cet éditeur fonctionne bien; lorsque vous entrez par exemple 11/01/2010 dans le champ de formulaire est ce bien transformé en une date par l'éditeur; aussi quand retour à la forme la date a été à nouveau une belle remontée convertie en chaîne.

Cependant, quand je (comme dans TestController) souhaite fixer une date par défaut sur le formulaire, puis cela devient simplement affiché une Date.toString () dans le champ de formulaire au lieu d'utiliser la valeur retournée par CustomDateEditor.getAsText ()! Après un certain débogage j'ai appris que ma méthode initBinder n'est pas appelée lorsque RequestMethod == GET. Est-ce normal?

Je suis sûr que je pourrais résoudre ce par ne pas utiliser

Merci pour votre aide,
Stijn

Était-ce utile?

La solution

Utilisation @ModelAttribute au domaine de configuration avant de transmettre à la page.

soigneusement à l'utilisation new lorsque vous traitez avec le printemps, il suffit de créer une nouvelle instance d'objet en dehors du contexte du printemps et vous ne pourrez pas utiliser la capacité de ressort (comme la liaison web, validation, etc.).

exemple:

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

et à votre domaine, vous pouvez utiliser:

@DateTimeFormat(pattern="dd/MM/yyyy")
private Date balance = new Date(System.currentTimeMillis());

Autres conseils

Je ne suis pas sûr, mais le second argument de la méthode registerCustomEditor est définie sur null. Cet argument est de définir le nom du champ que vous souhaitez associer l'éditeur avec, donc je ne sais pas exactement ce qu'il va se passer quand il est réglé sur null. Si vous souhaitez utiliser cet éditeur avec tous les champs d'un spécifique de type, il existe la même méthode sans ce paramètre:

public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)

Je voudrais essayer avec cela, mais je ne suis pas sûr que cela va résoudre le problème.

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

it helps.

Pour résoudre ce problème, je me suis code suivant dans mon contrôleur:



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


Mes problèmes avec ma classe était « Catégorie » ne pas être reconnu, parce @InitBinder n'a pas été appelé. La méthode « secrète » ici était de modifier mon « de @RequestMapping » pour inclure - dans le prototype de ce - 2 paramètres que je ne ai pas besoin:
            @ModelAttribute ( "catégorie") catégorie Catégorie,
            résultat BindingResult
Ce tout résolu (je sais que ce n'est pas magique, juste la fumée, des miroirs et de réflexion Java - mais je souhaite La littérature imprimée et en ligne aborderait simples cas d'utilisation comme celui-ci de façon appropriée).

Voici le code correspondant dans mon fichier JSP correspondant:



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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top