Pregunta

He siguiente (simplificado al hueso) Controlador:

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

}

El JSP:

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

Este es un controlador rápido que he creado para poner a prueba un problema que tuve con otra vista-controlador. Como se puede ver en el controlador de un CustomeDateEditor se define. En mi actual controlador de este editor está funcionando bien; cuando se introduce por ejemplo 11/01/2010 en el campo de formulario esto está muy bien convertida en una fecha por el editor; También cuando vamos a volver a la forma de la fecha fue de nuevo muy bien convierte en una cadena.

Sin embargo, cuando (como en TestController) desea establecer una fecha predeterminada en el formulario a continuación, esto se visualiza simplemente un Date.toString () en el campo de formulario en lugar de utilizar el valor devuelto por CustomDateEditor.getAsText ()! Después de una cierta depuración supe que mi método InitBinder no se llama cuando RequestMethod == GET. ¿Es esto normal?

Estoy seguro de que podría solucionar este al no utilizar

Gracias por su ayuda, España Stijn

¿Fue útil?

Solución

El uso @ModelAttribute al dominio de configuración antes de remitir a la página.

cuidadosamente para uso new cuando se trabaja con la primavera, se acaba de crear una nueva instancia de contexto primavera objeto fuera y no se puede utilizar cualquiera de capacidad de la primavera (tal como la unión web, validación, etc.).

ejemplo:

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

y en su dominio puede utilizar:

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

Otros consejos

No estoy seguro, pero el segundo argumento en el método registerCustomEditor se establece en NULL. Este argumento es establecer el nombre del campo que desea asociar con el editor, así que no sé exactamente lo que va a ocurrir cuando se establece en nulo. Si desea utilizar este editor con todos los campos de un tipo específico que existe el mismo método sin este parámetro:

public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)

me gustaría probar con esto, aunque no estoy seguro de que esto va a resolver el problema.

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

Espero que ayuda.

Para resolver esto, yo mismo he siguiente código en mi controlador:



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


Mis problemas fue con mi clase "Categoría" no ser reconocido, porque @InitBinder no estaba siendo llamado. El "secreto" aquí fue modificar mi método "@RequestMapping" para incluir - en ella de prototipo - 2 parámetros lo que no necesito:
            @ModelAttribute ( "categoría") Categoría Categoría,
            resultado BindingResult
Esta todo resuelto (Sé que no es magia, sólo humo, espejos y reflexión de Java - pero me gustaría que la impreso y literatura en la red se ocuparía de los casos de uso sencillo como esto adecuadamente).

Aquí está el código relevante en mi archivo JSP correspondiente:



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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top