Well the computer never lies but when I revert to normal execution the code executes.
I have tried to use the generics as in our production mode using aggregation with List<Object> but that gives me the same error… M > On 25 Mar 2020, at 08:50, Maria Arias de Reyna Dominguez > <maria...@redhat.com> wrote: > > Hi, > > A very very wild guess: could it be a problem with dependencies so you have > on your classpath two versions of the same class? The JVM should choose only > one of them and use it, but to me it is clear it doesn't think that the first > "se.tradechannel.mifid.gateway.model.Gateway" is the same as the latter > "se.tradechannel.mifid.gateway.model.Gateway". So there must be two versions > of it somewhere. > > On Wed, Mar 25, 2020 at 8:30 AM Mikael Andersson Wigander > <mikael.grevs...@gmail.com <mailto:mikael.grevs...@gmail.com>> wrote: > TL;DR > > We have a very interesting mystery in one of our Camel applications. > > We have a route where we aggregate incoming messages. > The messages are first unmarshalled from a JSON String to a Map<String, > Object> and then processed thru a model ending up with a POJO of “Gateway > objects". > This POJO is then aggregated in a List<Gateway>. The POJO implements > Serializable and has equals() and hash. > > The aggregationStrategy is from the example in documentation when wanting to > aggregate a List… > > LevelDB is used for persistance Repository > > When flushed we process the Exchange and starts looping using a for-loop > > final List<Gateway> body=exchange.getIn().getBody(List.class); > boolean hasObject=false; > for(Gateway s:body){ > final InvestmentFirm investmentFirm=s.getInvestmentFirm(); > if(null!=investmentFirm){ > if(StringUtils.isNoneBlank(investmentFirm.getExternalId())){ > hasObject=true; > break; > } > } > } > > The thing is where we get an Exception at the start of the for-loop, saying : > > java.lang.ClassCastException: se.tradechannel.mifid.gateway.model.Gateway > cannot be cast to se.tradechannel.mifid.gateway.model.Gateway > > I have debugged the code and the outcome of the aggregation is a > List<Gateway> but when starting to loop we get the exception > > > > And if we step here it will crash. > > We have refactored the aggregation for this route; previously we unmarshalled > the incoming JSON string to a Map<String, Object> and aggregated this in a > List but here we use Object as the datatype. After flushing we execute the > same logic with the for-loop and it runs fine… > > Below is a snippet of the code > > public void configure() throws Exception { > final DefaultAggregateController defaultAggregateController = new > DefaultAggregateController(); > > final LevelDBAggregationRepository shuttleRepo = new > LevelDBAggregationRepository("shuttleArt26", > "mifir/data/shuttle/article26.dat"); > > > //tag::route[] > from("{{shuttle.jms.incoming}}") > .unmarshal().json(JsonLibrary.Jackson, true) > .process(this::createShuttleObject) > .aggregate(constant(true), new ArrayListAggregationStrategy()) > .aggregateController(defaultAggregateController) > .aggregationRepository(shuttleRepo) > .parallelProcessing(false) > .completionSize(aggregation_size) > .stopOnException() > .to("direct:investmentFirm") > > .end(); > > > from("direct:investmentFirm") > .choice() > .when(exchange -> { //<.> > final List<Gateway> body = > exchange.getIn().getBody(List.class); > boolean hasObject = false; > for (Gateway s : body) { > final InvestmentFirm investmentFirm = > s.getInvestmentFirm(); > if (null != investmentFirm) { > if > (StringUtils.isNoneBlank(investmentFirm.getExternalId())) { > hasObject = true; > break; > } > } > } > log.debug("InvestmentFirms = " + hasObject); > return hasObject; > }) > .end(); > > } > public class ArrayListAggregationStrategy implements AggregationStrategy { > public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { > List<Gateway> newBody = newExchange.getIn().getBody(ArrayList.class); > List<Gateway> list; > > > //Ignore Exception here > if (null != newExchange.getException()) { > return oldExchange; > } > > //First Exchange to aggregate > if (null == oldExchange) { > list = new ArrayList<>(newBody); > newExchange.getIn().setBody(list); > return newExchange; > } else { > list = oldExchange.getIn().getBody(ArrayList.class); > list.addAll(newBody); > oldExchange.getIn().setBody(list); > return oldExchange; > } > } > } > > > > > We really can’t see what the heck is going on, it seems OK everything but > "the computer says No!” > > Anyone? > > Thx > > M