Unable to deploy EAR with enum type mapped property due a ClassCastException (SerializedType to CustomType)
luis22737928 Sep 27, 2016 7:27 AMI have an issue while deploing an EAR file in glassfish with an enum type property mapped on an entity class.
the problem occurs during deploy process with a simple enum property mapped on an Entity class auditting with envers. Glassfish throws:
Exception while preparing the app : org.hibernate.type.SerializableType cannot be cast to org.hibernate.type.CustomType
We are using:
- hibernate-core:5.2.2.Final (same with 5.2.0 and 5.1.0)
- hibernate-envers:5.2.2.Final (same with 5.2.0 and 5.1.0)
- Glassfish 4.1 build 13 (same with Glassfish 4.1.1)
Debuging the code I found that the problem is in org.hibernate.envers.configuration.internal.metadata.BasicMetadataGenerator, line 112:
parent.addElement( "param" ).addAttribute( "name", EnumType.NAMED ) .setText( "" + !( (EnumType) ( (CustomType) type ).getUserType() ).isOrdinal() );
the instance type is a SerializedType and can not by cast to CustomType.
The problem does not occur:
- if deploying on Payara Server 4.1.1.163
- or if use hibernate 4.3.0
- or if mark as @NotAudited the enum type properties
The entity code is:
import ar.gov.santafe.mpa.vesta.organizacion.Agente;
import ar.gov.santafe.mpa.vesta.organizacion.Dependencia;
import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.apache.commons.lang.StringUtils;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
@Entity
@Table (name = "publicacion")
@Inheritance (strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn (name = "dtype")
@Audited
@AuditTable (schema = "auditoria", value = "publicacion_auditoria")
@NamedQueries ({
@NamedQuery (name = "Publicacion.findPublicaciones",
query = "SELECT P FROM Publicacion P " +
" ORDER BY P.fechaPublicacion DESC ")})
public abstract class Publicacion {
@Id
@Column (name = "id")
@GeneratedValue (strategy = GenerationType.SEQUENCE,
generator = "publicacion_seq")
@SequenceGenerator (name = "publicacion_seq",
sequenceName = "publicacion_id_seq",
allocationSize = 1)
private Integer id;
@Column (name = "titulo", length = 1000, nullable = false)
private String titulo;
@Column (name = "contenido", nullable = false)
private String contenido;
@Column (name = "fecha_evento", nullable = true)
private Date fechaEvento;
@Column (name = "url_externa", nullable = true)
private String urlExterna;
@Column (name = "nombre_imagen", nullable = true)
private String nombreImagen;
@Column (name = "distribucion", nullable = false)
@Enumerated (EnumType.STRING)
//@NotAudited
private EnumDistribucionPublicacion distribucion;
@Column (name = "ancho", nullable = false)
@Enumerated (EnumType.STRING)
//@NotAudited
private EnumAnchoPublicacion ancho;
@Column (name = "fecha_publicacion", nullable = false)
private Date fechaPublicacion;
@Column (name = "fecha_ultima_modificacion", nullable = false)
private Timestamp fechaUltimaModificacion;
@ManyToOne (optional = false)
@JoinColumn (name = "agente_publica_id", nullable = false)
private Agente agentePublica;
@ManyToOne (optional = false)
@JoinColumn (name = "dependencia_id", nullable = false)
private Dependencia dependencia;
/**
* @deprecated Solo para cumplir con JPA
*/
@Deprecated
protected Publicacion () {
}
public Publicacion (String titulo, String contenido, LocalDate fechaEvento, String urlExterna,
String nombreImagen, EnumDistribucionPublicacion distribucion,
EnumAnchoPublicacion ancho, LocalDate fechaPublicacion, Agente agentePublica,
Dependencia dependencia)
throws PublicacionException {
setTitulo(titulo);
setContenido(contenido);
setFechaEvento(fechaEvento);
setUrlExterna(urlExterna);
setDistribucion(distribucion);
setNombreImagen(nombreImagen);
setAncho(ancho);
setFechaPublicacion(fechaPublicacion);
setAgentePublica(agentePublica);
setDependencia(dependencia);
fechaUltimaModificacion = Timestamp.valueOf(LocalDateTime.now());
}
...
...
...
The enum code is:
package ar.gov.santafe.mpa.vesta.portal;
public enum EnumAnchoPublicacion {
ANCHO_PUBLICACION_SIMPLE("Simple"),
ANCHO_PUBLICACION_DOBLE("Doble");
private final String nombre;
private EnumAnchoPublicacion (String nombre) {
this.nombre = nombre;
}
@Override
public String toString () {
return nombre;
}
}When the EAR file is deployed on Glassfish 4.1 I get the folowing ClassCastException:
[2016-09-26T12:05:05.326-0300] [glassfish 4.1] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=46 _ThreadName=admin-listener(2)] [timeMillis: 1474902305326] [levelValue: 1000] [[
Exception while preparing the app : org.hibernate.type.SerializableType cannot be cast to org.hibernate.type.CustomType
java.lang.ClassCastException: org.hibernate.type.SerializableType cannot be cast to org.hibernate.type.CustomType
at org.hibernate.envers.configuration.internal.metadata.BasicMetadataGenerator.mapEnumerationType(BasicMetadataGenerator.java:112)
at org.hibernate.envers.configuration.internal.metadata.BasicMetadataGenerator.addBasic(BasicMetadataGenerator.java:64)
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.addValueInFirstPass(AuditMetadataGenerator.java:223)
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.addValue(AuditMetadataGenerator.java:348)
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.addProperties(AuditMetadataGenerator.java:382)
at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:687)
at org.hibernate.envers.configuration.internal.EntitiesConfigurator.configure(EntitiesConfigurator.java:95)
at org.hibernate.envers.boot.internal.EnversServiceImpl.doInitialize(EnversServiceImpl.java:154)
at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:118)
at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:99)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:288)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:847)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:874)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:151)
at org.glassfish.persistence.jpa.PersistenceUnitLoader.loadPU(PersistenceUnitLoader.java:199)
at org.glassfish.persistence.jpa.PersistenceUnitLoader.<init>(PersistenceUnitLoader.java:107)
at org.glassfish.persistence.jpa.JPADeployer$1.visitPUD(JPADeployer.java:223)
at org.glassfish.persistence.jpa.JPADeployer$PersistenceUnitDescriptorIterator.iteratePUDs(JPADeployer.java:510)
at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:230)
at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:168)
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:925)
at org.glassfish.javaee.full.deployment.EarDeployer.prepareBundle(EarDeployer.java:309)
at org.glassfish.javaee.full.deployment.EarDeployer.access$200(EarDeployer.java:88)
at org.glassfish.javaee.full.deployment.EarDeployer$1.doBundle(EarDeployer.java:155)
at org.glassfish.javaee.full.deployment.EarDeployer$1.doBundle(EarDeployer.java:152)
at org.glassfish.javaee.full.deployment.EarDeployer.doOnAllBundles(EarDeployer.java:255)
at org.glassfish.javaee.full.deployment.EarDeployer.prepare(EarDeployer.java:152)
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:925)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:434)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:539)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:535)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:360)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:534)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:565)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$3.run(CommandRunnerImpl.java:557)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:360)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:556)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1464)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1300(CommandRunnerImpl.java:109)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1846)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1722)
at org.glassfish.admin.rest.resources.admin.CommandResource.executeCommand(CommandResource.java:404)
at org.glassfish.admin.rest.resources.admin.CommandResource.execCommandSimpInMultOut(CommandResource.java:234)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:365)
at org.glassfish.admin.rest.adapter.JerseyContainerCommandService$3.service(JerseyContainerCommandService.java:173)
at org.glassfish.admin.rest.adapter.RestAdapter.service(RestAdapter.java:179)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
]]I have searched the issue with no result, any idea about it?
Thank in advance