Primavera @InitBinder no invoca cuando mostrando la forma => CustomEditors no definida
-
26-09-2019 - |
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
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>