Apr 25

Jugando con Web Services e Hibernate. Método setter de las Collection.

 En un rato de entretenimiento me he dedicado a generar las clases java a partir de unos WSDL y XSD de Web Service. Para ello he usado wsdl2java de Apache CXF. Para que el entretenimiento fuera mayor, decidí hacer persistentes estas clases generadas usando Hibernate. Como no eran muchas clases y quiero aprender un poco de Hibernate, mi gran asignatura pendiente, me decido a hacer los ficheros hbm.xml a mano.

Me pongo a ello, hago mis primeras pruebas y tras corregir los errores evidentes, llega el que me ha llamado la atención y es motivo de este post.

Caused by: org.hibernate.PropertyNotFoundException: Could not find a setter for property poligonPositions in class

 

El error parece claro, en la propiedad PoligonPositions (un List dentro de la clase AreaGeografica), Hibernate no puede encontrar un método set de acceso a dicha propiedad, es decir, un setPoligonPositions(List). Miro la clase en cuestión y efectivamente, no hay método set. ¡Qué raro!, parece que el wsdl2java no ha generado el método set.

Venga a mirar la herramienta wsdl2java a ver si tiene alguna configuración o algo y no, no la he encontrado. Rebuscando en internet me encuentro que la especificación jax-ws dice que las colecciones no deben tener método set(). La clase generada, en el atributo, tiene añadido este comentario

/**
* Gets the value of the poligonPositions property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the poligonPositions property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getPoligonPositions().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Position }
*
*
*/
public List<Position> getPoligonPositions() {
 

 

que básicamente quiere decir que no se pone el set y que debemos llamar a getPoligonPositions().add(newItem).

Bueno, parece que por el lado de los Web Services no hay solución a esto, poner el set() a mano tampoco parece adecuado en una clase que ha sido generada automáticamente y que se puede "machacar" en cualquier momento.

Afortunadamente, en la parte de Hibernate si tenemos solución. En el fichero hbm.xml de la clase se puede poner algo como

<hiberante-mapping>
   <class …..>
      ….
     <list name="poligonPositions" … access="field">
         …
    </list>
     …
   </class>
</hibernate-mapping>

El atributo access="field" hace que hiberante, en vez de usar el método set(), vaya directamente al atributo.

 

Entradas relacionadas:

One Response to “Jugando con Web Services e Hibernate. Método setter de las Collection.”

  1. Federico Says:

    Muy interesante el artículo! Vengo siguiendo este blog hace bastante y últimamente estuve jugando un poco con Web services en Java, pero uso hibernate hace mucho y se me había pasado la existencia de esta característica, de hecho en algun lado de la documentación lei alguna vez que no era 100% necesario usar getters y setters en hibernate, pero la excepción que vos publicas me había convencido de lo contrario. En fin, muy interesante tu aporte!

Leave a Reply