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

Reply via email to