Conversión de String a Custom Object para Spring MVC ¿Enlace de datos?

Estoy utilizando SpringMcC SimpleFormController junto con Spring MVC’s form JTL para crear un formulario para editar un objeto genérico.

En mi formulario tengo un menú desplegable donde el usuario puede especificar un servidor mediante un menú desplegable.

Los servidores aquí se propagan mediante una llamada a la base de datos para todos los servidores disponibles. server es un servidor ORM pojo, que es un subobjeto de otro ORM pojo (Generic) que sirve como mi objeto de respaldo de formulario.

Mi objective aquí es cambiar la referencia del servidor de Generic, que se representa en el nivel de la base de datos como una clave externa a la tabla del servidor.

Estoy usando JPA como mi capa de persistencia y las clases de entidades generadas por JPA como mis pojos de ORM.

Desafortunadamente, esto no parece ser vinculante cuando se envía mi formulario, ya que no se puede traducir de String a Server.

 Field error in object 'generic' on field 'server': rejected value [1]; codes [typeMismatch.generic.server,typeMismatch.server,typeMismatch.com.generic.orm.jpa.Server,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [generic.server,server]; arguments []; default message [server]]; default message [Failed to convert property value of type [java.lang.String] to required type [com.generic.orm.jpa.Server] for property 'server'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [com.generic.orm.jpa.Server] for property 'server': no matching editors or conversion strategy found], generic=com.generic.orm.jpa.generic[id=3]} and static attributes {} 

He estado buscando un ejemplo de cómo lograr esto sin suerte. Creo que necesito sobrescribir algo dentro del SimpleFormController, como hice en esta pregunta , pero la documentación de Spring MVC es liviana en cuanto a los detalles. ¿Puede alguien ayudarme aquí?

    Creo que es correcto. Necesita registrar un editor personalizado en la carpeta como lo hizo antes para poder convertir una secuencia a una instancia de servidor. Hay un ejemplo de un PropertyEditor personalizado aquí en los documentos de referencia de Spring que debería comenzar.

    Estoy de acuerdo en que la documentación de MVC no es la mejor. He tenido que buscar mucho en Google y buscar en los foros de Spring.

    Solo como un complemento a la respuesta de Mark, esto es lo que terminé haciendo en mi controlador.

     @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Server.class, "serverId", new PropertyEditorSupport() { @Override public void setAsText(String text) { Server type = (Server) em.createNamedQuery("Server.findById") .setParameter("id", Short.parseShort(text)).getSingleResult(); setValue(type); } }); } 

    También puedes hacer esto usando Spring injection, a diferencia de las clases anónimas. Esto esbozado por el enlace en la respuesta de Marcos.

    También es posible que pueda extender ClassEditor (consulte a continuación) en lugar de PropertyEditorSupport. Los estados de Javadoc;

    Editor de propiedades para java.lang.Class, para habilitar la población directa de una propiedad de Clase sin recurrir a tener que usar una propiedad de nombre de clase String como puente.

    No sé si entiendo completamente el beneficio de esto, pero algo a tener en cuenta.

    Javadocs útiles

    • Soporte del editor de propiedades
    • Carpeta de datos de spring
    • Editores de propiedades de spring
    • Spring Class Editor

    Usar “server.id” puede ser una posible solución. Entonces, el resorte se une automáticamente al valor seleccionado o viceversa.

          

    La versión de anotación de la respuesta, en su controlador:

     @org.springframework.web.bind.annotation.InitBinder("yourFormName") protected void initBinder( org.springframework.web.bind.WebDataBinder binder) { binder.registerCustomEditor(Server.class, "serverId", new PropertyEditorSupport() { @Override public void setAsText(String text) { Server s = ...; // do whatever needed to convert setValue(s); } });