lunes, 27 de abril de 2009

Property Editor

Hace ya bastantes días que no escribo nada aquí, pero hoy tengo ingredientes suficientes para hacer un nuevo post: tiempo y un tema. Aunque es el primer día del curso, ya tengo cositas para mantener el blog activo, así que espero que junto a otros temas que tengo pendientes de escribir, pueda mantener esto vivo.

Hasta ahora, cuando definía un bean en Spring, para asignar valores a sus atributos o hacía referencia a otro bean, o a un tipo "simple".


¿Pero qué ocurre si var02 no fuera de tipo Integer, String, List, ... sino que se trata de una clase de nuestro dominio? Para esto, Spring nos ofrece los Property Editor. Para ver su funcionamiento, veamos un ejemplo. Supongamos que tenemos la siguiente clase:

Y que ahora, el atributo var02 de MiClase será una instancia de Usuario. La declaración anterior, nos daría un error, ya que el setVar02 espera un parámetro de tipo Usuario.

El primer paso que debemos dar para solucionar esta situación, es implementar una clase que a partir de una cadena de texto sea capaz de crear una instancia de Usuario, y a la vez, a partir de una instancia de Usuario nos devuelva una cadena de texto, para que se encargue de "traducir" lo que hayamos configurado. Esta clase debe extender a java.beans.PropertyEditorSupport y sobreescribir los métodos:
  1. public void setAsText(String text) throws IllegalArgumentException
  2. public String getAsText()
Para nuestro caso, un ejemplo puede ser la siguiente clase:


El siguiente paso es indicarle a Spring que queremos añadir nuestro propio Property Editors:

Y ahora si que podremos definir miBean, haciendo que var02 se inicialice con una instancia de Usuario, en la que nombre contendrá la cadena "Gregorio" y apellido la cadena "Mena".

5 comentarios:

  1. Primer dia en plan introducción y ya hay cositas interesantes que se nos habian pasado por alto. Esperemos que el resto del curso siga así...

    Y ya solo por tocar las narices, en ese ejemplo como contemplas a los miembros de la realeza con 500 nombres separados por espacios? jaja

    Un saludo!

    ResponderEliminar
  2. jajajaja ahí has dado... pero vamos, era un ejemplo sin darle muchas vueltas. Para ese caso, cambias la regla de configuración: en el split (método setAsText) pones "," en vez de un espacio, y en la definición del bean algo así como

    property name="var02" value="Ben Con Ganas De Liarla,Expósito"

    P.D.: Muy apropiado el Nick/URL ;)

    ResponderEliminar
  3. Buenas niño...
    no te parece más facil definir un bean tal que así:


    <bean id="miBean" class="net.prueba.MiBean">
    <property name="descripcion" value="Una propiedad de mi bean" />
    <property name="usuario">
    <bean class="net.prueba.Usuario">
    <property name="nombre" value="Federico" />
    <property name="apellidos" value="García Lorca" />
    </bean>
    </property>
    </bean>


    Saludos

    ResponderEliminar
  4. Hola. En este ejemplo la verdad es que sí... pero es eso, sólo un ejemplo (igual no cogí el más adecuado). La idea era mostrar una opción que ofrece Spring que en mi opinión es muy buena (otro ejemplo puede ser meter una fecha con un formato concreto), y para ello elegí un ejemplo cualquiera... en resumen, que la idea era mostrar el funcionamiento, no resolver un caso real de la mejor manera. Si vas al buscador de código de google (http://www.google.com/codesearch) verás unos 5000 proyectos que usan esta técnica, supongo que habrá mejores ejemplos que el que he puesto :S (lo que viene a decir qeu el ejemplo es malo, la técnica no lo creo).

    Saludos y gracias por pasarte (aunque no sé quién eres :P )

    ResponderEliminar
  5. Opción anotada.
    ¡¡¡¡Federico García Lorca!!!! parece mentira que no me reconozcas jajaja... venga muchacho.

    ResponderEliminar