Domanda

Ho seguito (semplificato all'osso) Controller:

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

}

Il jsp:

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

Questo è un controllore ho subito creato per testare un problema che ho avuto con un altro view-controller. Come si può vedere nel controller un CustomeDateEditor è definito. Nel mio controller attuale questo editor sta lavorando bene; quando si entra per esempio 11/01/2010 nel campo del modulo questo è ben convertita in una data dal redattore; anche quando si va di nuovo al modulo la data era di nuovo ben convertito in una stringa.

Tuttavia, quando (come nel TestController) voglio fissare una data predefinita sulla forma allora questo viene semplicemente visualizzato un Date.toString () nel campo di modulo invece di utilizzare il valore restituito da CustomDateEditor.getAsText ()! Dopo un po 'di debug ho imparato che il mio metodo InitBinder non viene chiamato quando RequestMethod == GET. È normale?

Sono sicuro che avrei potuto risolvere il problema questo non usando

Grazie per il vostro aiuto,
Stijn

È stato utile?

Soluzione

uso @ModelAttribute al dominio di installazione prima di inoltrare alla pagina.

attentamente per uso new quando avete a che fare con la primavera, sarà solo creare una nuova istanza di contesto primavera oggetto esterno e non è possibile utilizzare una qualsiasi delle funzionalità di primavera (come il legame web, validazione, ecc).

Esempio:

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

e al tuo dominio è possibile utilizzare:

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

Altri suggerimenti

Non sono sicuro, ma il secondo argomento del metodo registerCustomEditor è impostata su null. Questo argomento è quello di impostare il nome del campo che si desidera associare con l'editor, quindi non so esattamente che cosa sta per succedere quando è impostata su null. Se si desidera utilizzare questo editor con tutti i campi di un determinato tipo esiste lo stesso metodo, senza questo parametro:

public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)

vorrei provare con questo, anche se non sono sicuro che questo risolverà il problema.

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

La speranza aiuta.

Per risolvere questo problema, mi sono seguente codice nel mio Controller:



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


I miei problemi erano con la mia classe "Categoria" non essere riconosciuto, perché @InitBinder non è stato chiamato. Il "segreto" era quello di modificare il mio metodo "@RequestMapping" per includere - in esso è il prototipo - 2 parametri che non ho bisogno di:
            @ModelAttribute ( "categoria") categoria Categoria,
            risultato BindingResult
Questo tutto risolto (lo so che non è magia, solo fumo, specchi e di riflessione Java - ma vorrei che la stampato e la letteratura on-line sarebbe affrontare semplici casi d'uso in questo modo in modo appropriato).

Ecco il codice relativo nel mio file JSP corrispondente:



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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top