[ 
https://issues.apache.org/jira/browse/CAMEL-15686?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Franky Georg updated CAMEL-15686:
---------------------------------
    Description: 
Injecting an EndpointProducerBuilder bean that uses a simple expression causes 
an exception.
{code:java}
@Configuration
public class MyTestRoute extends EndpointRouteBuilder {
   private static final String MY_TOPIC = "testTopic";

   @Autowired
   private EndpointProducerBuilder myKafkaBean;

   @Override
   public void configure() {
      from(timer("myTimer").repeatCount(1))
            .setBody(constant("THIS IS A TEST MESSAGE"))
            .setProperty("destination2", constant(MY_TOPIC))
            .to("direct:publish-to-kafka2")
      ;

      from("direct:publish-to-kafka2")
            .toD(myKafkaBean)
      ;

      from(kafka(MY_TOPIC))
            .log("Received: ${body}")
      ;
   }

   @Bean
   public EndpointProducerBuilder myKafkaBean() {
      return kafka("${exchangeProperty.destination2}");
   }
}{code}
Exception from org.apache.kafka.clients.Metadata:
{code:java}
Metadata response reported invalid topics 
[${exchangeProperty.destination}]{code}
I don't have to _use_ the bean for the error to manifest, it's enough to 
@Autowire it.

 

It _does_ work for static endpoints:
{code:java}
    return kafka("myTopic"); // This works fine from an EndpointProducerBuilder 
bean{code}
And it _does_ work for dynamic endpoints in URI form:
{code:java}
    return "kafka:${exchangeProperty.destination}"; // This works fine but you 
lose type safety{code}
 

Creating beans like this is useful for unit testing as they can be overridden 
to return mock/direct/whatever-is-useful, _without_ _first creating the 
original endpoint_, which can significantly reduce execution time.

  was:
Injecting an EndpointProducerBuilder bean that uses a simple expression causes 
an exception.
{code:java}
@Configuration
public class MyTestRoute extends EndpointRouteBuilder {
   private static final String MY_TOPIC = "testTopic";

   @Autowired
   private EndpointProducerBuilder myKafkaBean;

   @Override
   public void configure() {
      from(timer("myTimer").repeatCount(1))
            .setBody(constant("THIS IS A TEST MESSAGE"))
            .setProperty("destination2", constant(MY_TOPIC))
            .to("direct:publish-to-kafka2")
      ;

      from("direct:publish-to-kafka2")
            .toD(myKafkaBean)
      ;

      from(kafka(MY_TOPIC))
            .log("Received: ${body}")
      ;
   }

   @Bean
   public EndpointProducerBuilder myKafkaBean() {
      return kafka("${exchangeProperty.destination2}");
   }
}{code}
 Exception from org.apache.kafka.clients.Metadata:
{code:java}
Metadata response reported invalid topics 
[${exchangeProperty.destination}]{code}
 

It _does_ work for static endpoints:
{code:java}
    return kafka("myTopic"); // This works fine from an EndpointProducerBuilder 
bean{code}
And it _does_ work for dynamic endpoints in URI form:
{code:java}
    return "kafka:${exchangeProperty.destination}"; // This works fine but you 
lose type safety{code}
 

Creating beans like this is useful for unit testing as they can be overridden 
to return mock/direct/whatever-is-useful, _without_ _first creating the 
original endpoint_, which can significantly reduce execution time.


> Enable EndpointDSL with simple expressions within an Endpoint Builder bean
> --------------------------------------------------------------------------
>
>                 Key: CAMEL-15686
>                 URL: https://issues.apache.org/jira/browse/CAMEL-15686
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-endpointdsl
>         Environment: Experienced with 
>  * Camel 3.3
>  * Spring Boot 2.3.4
>            Reporter: Franky Georg
>            Assignee: Claus Ibsen
>            Priority: Minor
>             Fix For: 3.7.0
>
>
> Injecting an EndpointProducerBuilder bean that uses a simple expression 
> causes an exception.
> {code:java}
> @Configuration
> public class MyTestRoute extends EndpointRouteBuilder {
>    private static final String MY_TOPIC = "testTopic";
>    @Autowired
>    private EndpointProducerBuilder myKafkaBean;
>    @Override
>    public void configure() {
>       from(timer("myTimer").repeatCount(1))
>             .setBody(constant("THIS IS A TEST MESSAGE"))
>             .setProperty("destination2", constant(MY_TOPIC))
>             .to("direct:publish-to-kafka2")
>       ;
>       from("direct:publish-to-kafka2")
>             .toD(myKafkaBean)
>       ;
>       from(kafka(MY_TOPIC))
>             .log("Received: ${body}")
>       ;
>    }
>    @Bean
>    public EndpointProducerBuilder myKafkaBean() {
>       return kafka("${exchangeProperty.destination2}");
>    }
> }{code}
> Exception from org.apache.kafka.clients.Metadata:
> {code:java}
> Metadata response reported invalid topics 
> [${exchangeProperty.destination}]{code}
> I don't have to _use_ the bean for the error to manifest, it's enough to 
> @Autowire it.
>  
> It _does_ work for static endpoints:
> {code:java}
>     return kafka("myTopic"); // This works fine from an 
> EndpointProducerBuilder bean{code}
> And it _does_ work for dynamic endpoints in URI form:
> {code:java}
>     return "kafka:${exchangeProperty.destination}"; // This works fine but 
> you lose type safety{code}
>  
> Creating beans like this is useful for unit testing as they can be overridden 
> to return mock/direct/whatever-is-useful, _without_ _first creating the 
> original endpoint_, which can significantly reduce execution time.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to