Decimal calculated field: java.lang.Double cannot be cast to java.math.BigDecimal

5
Hi, I'm using a calculated field (decimal) to show a sum of a collection of objects. The sum's result is a decimal value as well. So decimals all around. However, when opening the form on which the calculated field is shown, the form is infinitely loading and an error is found in the log: java.lang.Double cannot be cast to java.math.BigDecimal Is there any way to solve this issue in the modeler or is it a framework issue? Edit: I've added the stacktrace below. Also, I've found a workaround by formatting the decimal to string and then parsing it to decimal again. It's not pretty, but it's a workaround. java.lang.ClassCastException: java.lang.Double cannot be cast to java.math.BigDecimal at com.mendix.webui.jsonserialization.ResultSerializer.generateMendixObjectMember(ResultSerializer.scala:252) at com.mendix.webui.jsonserialization.ResultSerializer.com$mendix$webui$jsonserialization$ResultSerializer$$generateMemberValue(ResultSerializer.scala:213) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$com$mendix$webui$jsonserialization$ResultSerializer$$generateMendixObject$1.apply(ResultSerializer.scala:182) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$com$mendix$webui$jsonserialization$ResultSerializer$$generateMendixObject$1.apply(ResultSerializer.scala:177) at scala.collection.Iterator$class.foreach(Iterator.scala:743) at scala.collection.AbstractIterator.foreach(Iterator.scala:1174) at scala.collection.IterableLike$class.foreach(IterableLike.scala:72) at scala.collection.AbstractIterable.foreach(Iterable.scala:54) at com.mendix.webui.jsonserialization.ResultSerializer.com$mendix$webui$jsonserialization$ResultSerializer$$generateMendixObject(ResultSerializer.scala:177) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$generateMendixObjects$1.apply(ResultSerializer.scala:162) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$generateMendixObjects$1.apply(ResultSerializer.scala:162) at scala.collection.immutable.List.foreach(List.scala:383) at com.mendix.webui.jsonserialization.ResultSerializer.generateMendixObjects(ResultSerializer.scala:162) at com.mendix.webui.jsonserialization.ResultSerializer.generateSchemaObjects(ResultSerializer.scala:155) at com.mendix.webui.jsonserialization.ResultSerializer.com$mendix$webui$jsonserialization$ResultSerializer$$generate(ResultSerializer.scala:94) at com.mendix.webui.jsonserialization.ResultSerializer.generate(ResultSerializer.scala:73) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$com$mendix$webui$requesthandling$ClientRequestHandler$$convertClientActionResult$1.apply(ClientRequestHandler.scala:496) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$com$mendix$webui$requesthandling$ClientRequestHandler$$convertClientActionResult$1.apply(ClientRequestHandler.scala:491) at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99) at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99) at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230) at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40) at scala.collection.mutable.HashMap.foreach(HashMap.scala:99) at com.mendix.webui.requesthandling.ClientRequestHandler.com$mendix$webui$requesthandling$ClientRequestHandler$$convertClientActionResult(ClientRequestHandler.scala:491) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$handleRequest$1.apply$mcV$sp(ClientRequestHandler.scala:324) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$handleRequest$1.apply(ClientRequestHandler.scala:315) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$handleRequest$1.apply(ClientRequestHandler.scala:315) at com.mendix.core.session.Worker$$anonfun$receive$3$$anonfun$2$$anon$1.execute(ActionDispatching.scala:145) at com.mendix.util.classloading.Runner.doRunUsingClassLoaderOf(Runner.java:32) at com.mendix.core.session.Worker$$anonfun$receive$3$$anonfun$2.apply(ActionDispatching.scala:147) at scala.util.Try$.apply(Try.scala:191) at com.mendix.core.session.Worker$$anonfun$receive$3.applyOrElse(ActionDispatching.scala:141) at akka.actor.Actor$class.aroundReceive(Actor.scala:465) at com.mendix.core.session.Worker.aroundReceive(ActionDispatching.scala:137) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) at akka.actor.ActorCell.invoke(ActorCell.scala:487) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) at akka.dispatch.Mailbox.run(Mailbox.scala:220) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
asked
6 answers
1

To correct my colleague Achiel, this issue is fixed but the fix will be part of 6.8.0 and has not been released in 6.7.0.

The issue only occurs when you do a list retrieve followed by a single aggregate and if you do not use the list anywhere else in the microflow. This will cause the underlying query to be optimized to an aggregate query and trigger the bug. So, at the cost of some performance (how much is dependent on the amount of data that is being aggregated) you can work around this by using the list somewhere else in your microflow (e.g. a dummy loop) or doing a 2nd aggregate on the list (e.g. a dummy sum/count/average).

answered
0

From what you describe it sounds like a Mendix bug. But I am pretty sure the log would include a stacktrace you did not post here. That would have helped a lot to be sure.

answered
0

Yes, definitely a Mendix bug. You should file a ticket for this.

answered
0

We encounter the exact same issue. Core issue seems to be that the sum action returns a FLOAT instead of a DECIMAL (check in debug mode). Adding any action in the MF using the List that is input for the SUM will ensure that the sum returns a decimal again. Mendix bug I assume (did not log it yet). BTW I could not reproduce in a test model using the default database. The issue does occur when deploying against SQL Server database.

answered
0

Thanks for filing a ticket over this. As you probably already know by now, this has been solved in 6.7.0

answered
0

Just tested it in Mendix 6.8.0 and we still receive the error:

2016-09-01 13:14:17.325:

Blockquote java.lang.ClassCastException: java.lang.Long cannot be cast to java.math.BigDecimal at com.mendix.webui.jsonserialization.ResultSerializer.generateMendixObjectMember(ResultSerializer.scala:221) at com.mendix.webui.jsonserialization.ResultSerializer.com$mendix$webui$jsonserialization$ResultSerializer$$generateMemberValue(ResultSerializer.scala:185) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$com$mendix$webui$jsonserialization$ResultSerializer$$generateMendixObject$1.apply(ResultSerializer.scala:161) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$com$mendix$webui$jsonserialization$ResultSerializer$$generateMendixObject$1.apply(ResultSerializer.scala:157) at scala.collection.Iterator$class.foreach(Iterator.scala:742) at scala.collection.AbstractIterator.foreach(Iterator.scala:1194) at scala.collection.IterableLike$class.foreach(IterableLike.scala:72) at scala.collection.AbstractIterable.foreach(Iterable.scala:54) at com.mendix.webui.jsonserialization.ResultSerializer.com$mendix$webui$jsonserialization$ResultSerializer$$generateMendixObject(ResultSerializer.scala:157) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$generateMendixObjects$1.apply(ResultSerializer.scala:143) at com.mendix.webui.jsonserialization.ResultSerializer$$anonfun$generateMendixObjects$1.apply(ResultSerializer.scala:143) at scala.collection.immutable.List.foreach(List.scala:381) at com.mendix.webui.jsonserialization.ResultSerializer.generateMendixObjects(ResultSerializer.scala:143) at com.mendix.webui.jsonserialization.ResultSerializer.generateSchemaObjects(ResultSerializer.scala:137) at com.mendix.webui.jsonserialization.ResultSerializer.com$mendix$webui$jsonserialization$ResultSerializer$$generate(ResultSerializer.scala:80) at com.mendix.webui.jsonserialization.ResultSerializer.generate(ResultSerializer.scala:62) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$com$mendix$webui$requesthandling$ClientRequestHandler$$convertClientActionResult$1.apply(ClientRequestHandler.scala:411) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$com$mendix$webui$requesthandling$ClientRequestHandler$$convertClientActionResult$1.apply(ClientRequestHandler.scala:407) at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99) at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99) at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230) at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40) at scala.collection.mutable.HashMap.foreach(HashMap.scala:99) at com.mendix.webui.requesthandling.ClientRequestHandler.com$mendix$webui$requesthandling$ClientRequestHandler$$convertClientActionResult(ClientRequestHandler.scala:407) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$handleRequest$1.apply$mcV$sp(ClientRequestHandler.scala:330) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$handleRequest$1.apply(ClientRequestHandler.scala:304) at com.mendix.webui.requesthandling.ClientRequestHandler$$anonfun$handleRequest$1.apply(ClientRequestHandler.scala:304) at com.mendix.core.session.Worker$$anonfun$receive$3$$anonfun$2$$anon$1.execute(ActionDispatching.scala:144) at com.mendix.util.classloading.Runner.doRunUsingClassLoaderOf(Runner.java:36) at com.mendix.core.session.Worker$$anonfun$receive$3$$anonfun$2.apply(ActionDispatching.scala:146) at scala.util.Try$.apply(Try.scala:192) at com.mendix.core.session.Worker$$anonfun$receive$3.applyOrElse(ActionDispatching.scala:140) at akka.actor.Actor$class.aroundReceive(Actor.scala:465) at com.mendix.core.session.Worker.aroundReceive(ActionDispatching.scala:136) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) at akka.actor.ActorCell.invoke(ActorCell.scala:487) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) at akka.dispatch.Mailbox.run(Mailbox.scala:220) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

2016-09-01 13:14:17.325:

Blockquote com.mendix.systemwideinterfaces.MendixRuntimeException: org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value at com.mendix.util.classloading.Runner.doRunUsingClassLoaderOf(Runner.java:40) Caused by: org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value at org.codehaus.jackson.impl.JsonGeneratorBase._reportError(JsonGeneratorBase.java:480) at org.codehaus.jackson.impl.WriterBasedGenerator.writeFieldName(WriterBasedGenerator.java:195) at com.mendix.webui.jsonserialization.JsonGeneratorWrapper$$anonfun$writeFieldName$1.apply(JsonGeneratorWrapper.scala:43) at com.mendix.webui.jsonserialization.JsonGeneratorWrapper$$anonfun$writeFieldName$1.apply(JsonGeneratorWrapper.scala:43) at scala.collection.immutable.List.foreach(List.scala:381) at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) at scala.collection.mutable.ListBuffer.foreach(ListBuffer.scala:45) at com.mendix.webui.jsonserialization.JsonGeneratorWrapper.writeFieldName(JsonGeneratorWrapper.scala:43) at com.mendix.webui.jsonserialization.ResultSerializer.writeException(ResultSerializer.scala:36) at com.mendix.webui.requesthandling.ClientRequestHandler.logAndWriteException(ClientRequestHandler.scala:434) at com.mendix.webui.requesthandling.ClientRequestHandler.processException(ClientRequestHandler.scala:426) at com.mendix.webui.requesthandling.ClientRequestHandler.handleRequest(ClientRequestHandler.scala:280) at com.mendix.webui.requesthandling.ClientRequestHandler.handleActionWithSessionRequired(ClientRequestHandler.scala:235) at com.mendix.webui.requesthandling.ClientRequestHandler.handleAction(ClientRequestHandler.scala:198) at com.mendix.webui.requesthandling.ClientRequestHandler.liftedTree1$1(ClientRequestHandler.scala:95) at com.mendix.webui.requesthandling.ClientRequestHandler.processRequest(ClientRequestHandler.scala:87) at com.mendix.externalinterface.connector.MxRuntimeConnector$1.execute(MxRuntimeConnector.java:69) at com.mendix.externalinterface.connector.MxRuntimeConnector$1.execute(MxRuntimeConnector.java:66) at com.mendix.util.classloading.Runner.doRunUsingClassLoaderOf(Runner.java:36) at com.mendix.externalinterface.connector.MxRuntimeConnector.processRequest(MxRuntimeConnector.java:72) at com.mendix.core.impl.MxRuntimeImpl.processRequest(MxRuntimeImpl.java:742) at com.mendix.m2ee.appcontainer.server.handler.RuntimeHandler.handle(RuntimeHandler.java:41) at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:368) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:953) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1014) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) at java.lang.Thread.run(Thread.java:745)

[SOLVED: Found the cause, we used a virtual attribute of the type decimal. The Microflow however returned an integer...]

answered