Frage

Ich habe folgende (vereinfachte bis auf die Knochen) 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));
}

}

Die jsp:

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

Dies ist ein Controller ich schnell ein Problem zu testen, habe ich mit einem anderen View-Controller hatte. Wie Sie im Controller ein CustomeDateEditor sehen kann, ist definiert. In meinem eigentlichen Controller arbeitet dieser Editor in Ordnung; wenn Sie geben zum Beispiel 11.01.2010 in dem Formularfeld dieser gut in eine vom Editor umgewandelt wird; auch wenn sie auf die Form war das Datum wieder schön umgebaute zurück in einen String zurück.

Allerdings, wenn ich (wie in Testcontroller) einen Standarddatum auf dem Formular setzen dann diese einfach eine Date.toString () in dem Formularfeld des Rückgabewert von CustomDateEditor.getAsText verwendet stattdessen angezeigt werden ()! Nach einiger Fehlersuche habe ich gelernt, dass meine InitBinder Methode nicht aufgerufen wird, wenn request == GET. Ist das normal?

Ich bin sicher, dass ich diese umgehen konnte durch den Verzicht auf

Danke für Ihre Hilfe,
Stijn

War es hilfreich?

Lösung

Verwendung @ModelAttribute Setup-Domäne vor zu Seite weitergeleitet werden.

sorgfältig zu verwenden new, wenn Sie mit Feder beschäftigen, wird es nur eine neue Instanz des Objekts außerhalb Feder Kontext erstellen und Sie können nicht von Federfähigkeit verwenden (wie zB Web-Bindung, Validierung, etc).

Beispiel:

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

und in Ihrer Domain können Sie:

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

Andere Tipps

Ich bin mir nicht sicher, aber das zweite Argument in registerCustomEditor Methode wird auf null gesetzt. Dieses Argument ist der Feldname festlegen, die Sie mit dem Editor zugeordnet werden soll, damit ich weiß nicht genau, was es wird geschehen, wenn es auf null gesetzt wird. Wenn Sie diesen Editor mit allen Feldern eines spezifischen verwenden möchten geben sie die gleiche Methode ohne diesen Parameter vorhanden ist:

public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)

Ich würde mit diesem versuchen, obwohl ich nicht sicher bin, das Problem zu lösen.

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

Hope es hilft.

Um dies zu lösen, ich habe folgenden Code in meinem 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);
        }
    }


Meine Fragen waren mit meiner „Kategorie“ Klasse nicht erkannt zu werden, weil @InitBinder nicht genannt wurde. Das „Geheimnis“ hier waren meine „@RequestMapping“ Methode zu ändern, um zu umfassen - in seinem Prototyp - 2 Parameter was ich nicht brauche:
            @ModelAttribute ( "Kategorie") Kategorie Kategorie,
            BindingResult Ergebnis
Dies löste alles (ich weiß, es ist keine Magie, nur rauchen, Spiegel und Java reflection - aber ich wünsche, die Print- und Online-Literatur würden einfache Anwendungsfälle wie diese in geeigneter Weise) ansprechen.

Hier ist der relevante Code in meiner entsprechenden JSP-Datei:



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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top