The json processing fails serializing an entity running on JBoss eap 8 but the same code works fine on JBoss eap 7.4.
Here is an example of the stack trace:
Caused by: jakarta.json.bind.JsonbException: Unable to serialize property 'codeIngotToken' from org.jboss.as.quickstarts.kitchensink.model.ValIngot at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.ObjectSerializer.lambda$serialize$0(ObjectSerializer.java:43) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.ObjectSerializer.serialize(ObjectSerializer.java:38) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.RecursionChecker.serialize(RecursionChecker.java:38) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.KeyWriter.serialize(KeyWriter.java:41) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.NullVisibilitySwitcher.serialize(NullVisibilitySwitcher.java:40) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.NullSerializer.serialize(NullSerializer.java:67) at org.eclipse.yasson//org.eclipse.yasson.internal.SerializationContextImpl.serializeObject(SerializationContextImpl.java:197) at org.eclipse.yasson//org.eclipse.yasson.internal.SerializationContextImpl.marshall(SerializationContextImpl.java:133) at org.eclipse.yasson//org.eclipse.yasson.internal.SerializationContextImpl.marshall(SerializationContextImpl.java:159) at org.eclipse.yasson//org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:131) at deployment.kitchensink.war//org.jboss.as.quickstarts.kitchensink.service.SesnEJB.generateIngotNoRelationshipJson(SesnEJB.java:60) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.jboss.as.ee@8.0.9.GA-redhat-00004//org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:509) at org.jboss.as.weld.common@8.0.9.GA-redhat-00004//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.delegateInterception(Jsr299BindingsInterceptor.java:79) at org.jboss.as.weld.common@8.0.9.GA-redhat-00004//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:89) at org.jboss.as.weld.common@8.0.9.GA-redhat-00004//org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:102) at org.jboss.as.ee@8.0.9.GA-redhat-00004//org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.as.ejb3@8.0.9.GA-redhat-00004//org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.as.jpa@8.0.9.GA-redhat-00004//org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.as.ee@8.0.9.GA-redhat-00004//org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:40) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:53) at org.jboss.as.ee@8.0.9.GA-redhat-00004//org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.as.ejb3@8.0.9.GA-redhat-00004//org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.as.ejb3@8.0.9.GA-redhat-00004//org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:56) at org.jboss.invocation@2.0.0.Final-redhat-00001//org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:422) at org.jboss.as.ejb3@8.0.9.GA-redhat-00004//org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:254) ... 140 more Suppressed: jakarta.json.stream.JsonGenerationException: Generating incomplete JSON at org.eclipse.parsson//org.eclipse.parsson.JsonGeneratorImpl.close(JsonGeneratorImpl.java:521) at org.eclipse.yasson//org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:130) ... 169 more Caused by: java.lang.UnsupportedOperationException at java.sql/java.sql.Date.toInstant(Date.java:316) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.DateSerializer.toInstant(DateSerializer.java:36) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.DateSerializer.toTemporalAccessor(DateSerializer.java:56) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.DateSerializer.formatWithFormatter(DateSerializer.java:46) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.DateSerializer.formatWithFormatter(DateSerializer.java:26) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.AbstractDateSerializer.lambda$valueSerializer$3(AbstractDateSerializer.java:63) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.AbstractDateSerializer.lambda$new$1(AbstractDateSerializer.java:51) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.AbstractDateSerializer.serializeValue(AbstractDateSerializer.java:147) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.TypeSerializer$ValueSerializer.serialize(TypeSerializer.java:51) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.types.TypeSerializer.serialize(TypeSerializer.java:37) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.KeyWriter.serialize(KeyWriter.java:41) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.NullSerializer.serialize(NullSerializer.java:67) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.ValueGetterSerializer.serialize(ValueGetterSerializer.java:43) at org.eclipse.yasson//org.eclipse.yasson.internal.serializer.ObjectSerializer.lambda$serialize$0(ObjectSerializer.java:41) ... 179 more
The "codeIngotToken" property is a java.util.Date marked with @Temporal(TemporalType.DATE):
@Temporal(TemporalType.DATE)
private Date codeIngotToken;
The entity is retrieved from sql query. As a result, the property is automatically assigned with java.sql.Date type:
***************************************
@NamedQueries(
)
EntIngot entIngot = findBySerial(numberSerial);
//the entIngot.getCodeIngotToken() returns type java.sql.Date
****************************************
The jsonb processing is triggered by the code, for example:
EntIngot entIngot = findBySerial(numberSerial); Jsonb jsonb = JsonbBuilder.create(); jsonb.toJson(entIngot);
The jsonb processing handles the java.util.Date differently in eap 7.4 (eclipse yassson 1.0.5) and 8.0 (eclipse yasson 3.0.4)
The current implementation that doesn't work: [1]
@Override protected Instant toInstant(Date value) { return value.toInstant(); }
The old implementation that works: [2]
@Override protected Instant toInstant(Date value) { return Instant.ofEpochMilli(value.getTime()); }
The proposed change:
@Override protected Instant toInstant(Date value) { if (value instanceof java.sql.Date){ return Instant.ofEpochMilli(value.getTime()); } else { return value.toInstant(value); } }
[1] https://github.com/eclipse-ee4j/yasson/blob/3.0.4/src/main/java/org/eclipse/yasson/internal/serializer/types/DateSerializer.java#L34-L37
[2] https://github.com/eclipse-ee4j/yasson/blob/1.0.5-RELEASE/src/main/java/org/eclipse/yasson/internal/serializer/AbstractDateTypeSerializer.java#L39-L42
- blocks
-
JBEAP-30325 [GSS](8.0.z) Json processing failed with error java.lang.UnsupportedOperationException at java.sql/java.sql.Date.toInstant
-
- Closed
-
- clones
-
JBEAP-30362 (8.1.z) Json processing failed with error java.lang.UnsupportedOperationException at java.sql/java.sql.Date.toInstant
-
- Verified
-