martes, 29 de septiembre de 2020

Conflicto de librerias de Hibernate Envers: java.lang.NoSuchMethodError: org.codehaus.stax2.ri.EmptyIterator.getInstance()

Problema (ir al apartado de solución)

El problema viene que hay un conflicto de dependencias de la stax2-api pues se uilizan distintas versiones.

El sistema de compilación de Maven parece ser que elimina las versiones mas viejas, por tanto cualquier referencia a métodos que se encuentren excluisivamente en versiones viejas, dan error de "runtime" que en este caso indica que no encuentra el método.

Para solucionarlo hacemos uso de <scope>runtime</scope> en cada una de las dependencias antigua que queremos.

Su suso está bien explicado en Baeldung y en mi caso tenía que suministrar las versiones 4.2.1 y la 3.1.4

Quedando en el pom.xml este fragmento



<dependency>
  <groupId>org.codehaus.woodstox</groupId>
  <artifactId>stax2-api</artifactId>
  <version>4.2.1</version>
  <scope>runtime</scope>
</dependency>
		 
<dependency>
  <groupId>org.codehaus.woodstox</groupId>
  <artifactId>stax2-api</artifactId>
  <version>3.1.4</version>
  <scope>runtime</scope>
</dependency>

Con esta adición de dependencias parece ser que se ha solucionado si se ejecuta como Java applicaion pero no en modo web

Por tanto para ejecutar una clase que abra una sesion de JPA Hibernate que haga uso de Hibernate Envers con la anotiación @Audited en una Entidad como la clase FirstControlLoad, hay que añadir este código al pom-xml, pero hay que quitarlo para generar el war!!!

Solución buena

20/01/2022. Se puede solucionar lo de Hibernate Envers utilizando la nueva implementación de jakarta que no utiliza el stax2-api


implementation 'org.hibernate:hibernate-core-jakarta:5.6.3.Final'
implementation 'org.hibernate:hibernate-envers-jakarta:5.6.3.Final'
//implementation "org.hibernate:hibernate-testing-jakarta:5.6.3.Final'
implementation "org.hibernate:hibernate-validator:7.0.2.Final" 



jueves, 17 de septiembre de 2020

JPA Problema: @MappedSuperClass No reconoce el @Id las clases hijas

Problema:

Tenemos una clase anotada con @MappedSuperClass a la que defibnimos un campo con la notación @Id y queremos que este campo se herede para todas las clases hijas,

El problema surge cuando:

1. Anotamos con @Entity a las clases hijas y

2. Las clases hijas están en otro paquete

Entonces Eclipse se queja diciendo que:

"The entity has no primary key attribute defined" 


Solución:

Añadir la clase madre(la del @MappedSuperClass)  con una tag  <class> al fichero "persistence.xml" si este tiene la etiqueta <exclude-unlisted-classes> a true

martes, 15 de septiembre de 2020

JSON XML + LOMBOK + SICRES 3.0 Problemas de mapeado de clases

 Tenemos el siguiente error

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `openadmin.model.sicres.DeInteresado` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('E')


Solución:

Cambiar este código:

XmlMapper mapper = new XmlMapper();

Por este

JacksonXmlModule xmlModule = new JacksonXmlModule();
xmlModule.setDefaultUseWrapper(false);
ObjectMapper mapper = new XmlMapper(xmlModule);
mapper.registerModule(new JaxbAnnotationModule()); // Accept JAXB Annotations !!!!

para que acepte JAXB annotations!