Hi In rest-dsl you can/should use routeId("myId") anot not id("myId") to specify the route id
On Mon, Jan 23, 2023 at 2:11 PM Nikola Glidzic <nikola.glid...@ikor.one> wrote: > Hello Camel crew, > > I will explain in details what I have discovered, how to reproduce it and > potential idea for fixing the issue. I am using Camel version 3.18.4. > > In my code, I have Camel unit tests where I extend CamelTestSupport. I am > testing routes from one single RouteBuilder object which has some simple > routes, but it has also routes created with REST DSL. > What I am doing in this test is simply mocking these REST DSL routes in my > test, hence I am using AdviceWith: > > AdviceWith.adviceWith( "myRestRouteId", context, new > AdviceWithRouteBuilder() { > @Override > public void configure() throws Exception { > replaceFromWith("direct: myRestRouteIdTesting"); > } > }); > > The problem is that Advice will search for a RouteDefinition with given id > "myRestRouteId", but it can't find it and I get following exception: > java.lang.IllegalArgumentException: Cannot advice route as route with id: > myRestRouteId does not exists This exception happens only for REST DSL > routes. > > I have an explanation what happens and what should be a fix. Let me > explain: > > Before starting the routes in the Camel context, what happens first is > that all RouteDefinitions will be collected. But REST DSL routes will be > collected as VerbDefinition-s. So at the beginning given routeId will be > stored in a VerbDefinition object. After that in a class RestDefinition > there is a method asRouteDefinition() which calls addRouteDefinition() > method. > Then addRouteDefinition() will actually loop through all VerbDefinition-s > and will transform them one by one in RouteDefinition-s. But here it is > missed to set routeId for RouteDefinition. > > My proposal for fix would be just to add a single line in mentioned > transformation loop: route.setId(verb.getId()); > > All of this happens before Camel Context starts the routes. Problem was > well hidden because later during the route starting phase, there is > forceAssignIds() method in RouteDefinitionHelper class, which will take > routeId from VerbDefinition and assign it to proper RouteDefinition. And > then at the end as final result, when all routes are started, you will have > your route id for your REST DSL route. > But semantically looking, route id should be assigned to RouteDefinition > earlier, during lets call it "reading and building RouteDefinitions phase". > > Anyway the problem exists when you try to test routes and use AdviceWith. > I think this is a bug and fix is necessary since AdviceWith currently > doesn't work for all routes. > > What you think about this? Should I open Jira ticket for this? > Just to mention that I already tried this fix and AdviceWith worked as > expected. > > Kind Regards, > Nikola Glidzic > -- Claus Ibsen ----------------- @davsclaus Camel in Action 2: https://www.manning.com/ibsen2