CodelyTV / java-ddd-example

♨️ DDD in Java skeleton & examples. Course:
https://pro.codely.tv/library/ddd-en-java/about/
426 stars 204 forks source link

Error con hibernate usando docker JAR #67

Closed zamudio-fabian closed 3 years ago

zamudio-fabian commented 3 years ago

Descripción

Estoy comenzando a aplicar DDD en un proyecto ya funcional. Hasta el momento logre hacer funcionar correctamente una simple búsqueda de datos en la BD implementado la abstracción de hibernate usando los archivo hbm.xml.

Al momento de intentar ejecutar el mismo en docker el mismo falla al buscar los resultados de la BD con el siguiente error:

company-notification | 2021-02-19 18:04:18.636 ERROR 1 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.remax.notification.aggregates.shared.domain.bus.query.QueryHandlerExecutionError: java.lang.IllegalArgumentException: Not an entity: class com.company.notification.aggregates.notification_type.domain.NotificationType] with root cause
company-notification | java.lang.IllegalArgumentException: Not an entity: class com.company.notification.aggregates.notification_type.domain.NotificationType
company-notification | at org.hibernate.metamodel.internal.MetamodelImpl.entity(MetamodelImpl.java:566) ~[hibernate-core-5.4.9.Final.jar!/:5.4.9.Final]
company-notification | at org.hibernate.query.criteria.internal.QueryStructure.from(QueryStructure.java:127) ~[hibernate-core-5.4.9.Final.jar!/:5.4.9.Final]
company-notification | at org.hibernate.query.criteria.internal.CriteriaQueryImpl.from(CriteriaQueryImpl.java:154) ~[hibernate-core-5.4.9.Final.jar!/:5.4.9.Final]

Posible causa

Estoy casi seguro que es por debido a la función searchMappingFiles que no encuentra los archivos de definición y al recuperar no encuentra una entidad para tales datos.

Config

DockerFile

FROM amazoncorretto:11
VOLUME /tmp
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Prueba nro 1

Cambie el docker file al siguiente:

FROM amazoncorretto:11
VOLUME /tmp
COPY build/libs/*.jar app.jar
COPY src/main/resources/hibernate/NotificationType.hbm.xml /hibernate/NotificationType.hbm.xml
ENTRYPOINT ["java","-jar","/app.jar"]

Ademas de hacer hacer que el mapping buscara los archivos en la carpeta /hibernate/ lo cual soluciona el problema y confirma mis sospechas sobre que no encuentran esos archivos. Ahora solo me queda mejorar un poco la estructura y encuentre dinámicamente según el contexto a donde buscar los archivos

Solución (con posibles mejoras)

Moviendo los archivos hbm.xml a resources/db/hibernate y cambiando la función de mapping por la siguiente:

private List<Resource> searchMappingFiles() throws IOException {
        ClassLoader cl = this.getClass().getClassLoader();
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl);
        Resource[] resources = resolver.getResources("classpath:/db/hibernate/*.hbm.xml");
        return Arrays.asList(resources.clone());
}
r2d2f commented 3 years ago

La verdad que a mi nunca me funcionó el searchMappingFiles cuando exporto como un jar.

Solo funciona cuando usas en el IDE... El tema es que la estructura de directorios es distinta cuando se empaqueta en un jar, no es la misma que cuando corres la aplicacion desde el IDE.

Yo solucione parcialmente eso (hacia mi casa se llama, alambre) especificando directamente los archivos del Mapping, sin usar el searchMappingFiles. No me dio el tiempo arreglarlo bien realmente.

zamudio-fabian commented 3 years ago

La verdad que a mi nunca me funcionó el searchMappingFiles cuando exporto como un jar.

Solo funciona cuando usas en el IDE... El tema es que la estructura de directorios es distinta cuando se empaqueta en un jar, no es la misma que cuando corres la aplicación desde el IDE.

Yo solucione parcialmente eso (hacia mi casa se llama, alambre) especificando directamente los archivos del Mapping, sin usar el searchMappingFiles. No me dio el tiempo arreglarlo bien realmente.

Entiendo, creo que la solución que encontré es decenté por solo haber indagado un par de horas. En nuestro equipo no nos molesta tener los XML dentro de resources asique es posible que lo dejemos de esa manera.

Dejo un par de días abierto el thread por si alguien más quiere aportar su opinión

r2d2f commented 3 years ago

Y si, a mi me parece valida tambien tu solucion... Creo que es cuestion de gustos nomas.

Creo que en uno de los videos decian que ellos querian que el mapping este dentro de la carpeta del dominio, por eso tal vez ya no cambiaron.