how to serialize java 8 LocalDateTime and java.time.* classes

212 views
Skip to first unread message

Cory Showers

unread,
Jul 22, 2014, 5:38:43 PM7/22/14
to gran...@googlegroups.com
I saw that in there is support now for Java 8 DateTime classes in jira https://jira.granitedataservices.com/browse/GDS-1268
However when doing a simple test case of serializing LocalDateTime from client to server I get the following error

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/indms] threw exception
java.io.IOException: java.lang.IllegalAccessException: Class org.granite.messaging.reflect.ConstructorInstantiator can not access a member of class java.time.Ser with modifiers "public"
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:136)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:241)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:235)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:235)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:226)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:179)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:241)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:226)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:179)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.jmf.codec.std.impl.ArrayListCodecImpl.decode(ArrayListCodecImpl.java:84)
at org.granite.messaging.jmf.codec.std.impl.ArrayListCodecImpl.decode(ArrayListCodecImpl.java:40)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.jmf.JMFDeserializer.readAndSetProperty(JMFDeserializer.java:336)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:241)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decodeSerializable(ObjectCodecImpl.java:226)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:179)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)
at org.granite.messaging.webapp.AMFEndpoint.serviceJMFAMF(AMFEndpoint.java:147)
at org.granite.messaging.webapp.AMFEndpoint.service(AMFEndpoint.java:64)
at org.granite.spring.ServerFilter.handle(ServerFilter.java:331)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalAccessException: Class org.granite.messaging.reflect.ConstructorInstantiator can not access a member of class java.time.Ser with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:101)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:295)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:287)
at java.lang.reflect.Constructor.newInstance(Constructor.java:398)
at org.granite.messaging.reflect.ConstructorInstantiator.newInstance(ConstructorInstantiator.java:37)
at org.granite.messaging.reflect.ClassDescriptor.newInstance(ClassDescriptor.java:107)
at org.granite.messaging.jmf.codec.std.impl.ObjectCodecImpl.decode(ObjectCodecImpl.java:171)
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:130)

I am not using any custom Converters and I was expected granite to support java 8 dates automatically.  Do I have to enable this feature?

My test case is just a dummy service with LocalDateTime as the in/out parameters
this.service.testLocalDate(LocalDateTime.now, new TideResponder<LocalDateTime>() {

@Override
public void result(TideResultEvent<LocalDateTime> event) {
log.info("yaay Java 8 dates " + event.getResult().toString());
 
}

@Override
public void fault(TideFaultEvent event) {
log.error("", event);
}
});

I'm using JavaFX 8_u20 on client and Java 8_u20 on server in a tomcat 7 container.   
Granite ver: 3.1.0.RC1

Cory Showers

unread,
Jul 23, 2014, 9:30:45 AM7/23/14
to gran...@googlegroups.com
FYI - I did some digging and saw the fix was related to granite-jmf-java8 module.   I added this maven dependency on server and still same error.

Cory Showers

unread,
Jul 24, 2014, 10:04:28 AM7/24/14
to gran...@googlegroups.com
Anyone has an idea about this?  Still no luck.  I might have to just implement custom converters.

Fabiano Frizzo

unread,
Jul 24, 2014, 10:15:24 AM7/24/14
to gran...@googlegroups.com

Att
Fabiano Frizzo

(45)3324-4204
(45)9969-7850


--

---
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes "Granite Data Services Forum".
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse graniteds+...@googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Cory Showers

unread,
Jul 24, 2014, 10:18:29 AM7/24/14
to gran...@googlegroups.com
Ok, but I'm not sure what this JIRA fix is supposed to  do https://jira.granitedataservices.com/browse/GDS-1268   

I thought with the new RC1 release I wouldn't have to write a converter.  Maybe I was wrong.

William Drai

unread,
Jul 24, 2014, 2:14:05 PM7/24/14
to gran...@googlegroups.com
The Java8 module works only when the client AND the server run on Java 8.
It might be possible to implement a custom encoder/decoder that would work  with Java 8 on the client but that would mean that all dates are received as Java 8 style dates.

De : Cory Showers
Envoyé : ‎24/‎07/‎2014 16:04
À : gran...@googlegroups.com
Objet : [graniteds] Re: how to serialize java 8 LocalDateTime and java.time.*classes

--

Cory Showers

unread,
Jul 24, 2014, 2:37:35 PM7/24/14
to gran...@googlegroups.com
hmm not sure what i'm doing wrong then.  Both the server and client are Java 8 I added java8 module to server pom.  The exception is not very obvious. it complaining about public modifiers on java.time.LocalDateTime.  Could it be that there is no default public constructor for LocalDateTime.  The only way I instantiate it in code is to do the following LocalDateTime.now();


java.io.IOException: java.lang.IllegalAccessException: Class org.granite.messaging.reflect.ConstructorInstantiator can not access a member of class java.time.Ser with modifiers "public"
at org.granite.messaging.jmf.JMFDeserializer.readObject(JMFDeserializer.java:136)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.readObjectArray0(ObjectArrayCodecImpl.java:215)
at org.granite.messaging.jmf.codec.std.impl.ObjectArrayCodecImpl.decode(ObjectArrayCodecImpl.java:165)


William Drai

unread,
Jul 24, 2014, 3:26:20 PM7/24/14
to gran...@googlegroups.com
You need the granite-jmf8 module on both the client and the server

De : Cory Showers
Envoyé : ‎24/‎07/‎2014 20:37
À : gran...@googlegroups.com
Objet : Re: [graniteds] Re: how to serialize java 8 LocalDateTime andjava.time.*classes

Cory Showers

unread,
Jul 24, 2014, 3:35:42 PM7/24/14
to gran...@googlegroups.com
excellent that was the key.  I only had module on server instead of both.   wheew

thanks
Reply all
Reply to author
Forward
0 new messages