camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Colin Harms (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (CAMEL-9656) Using SpringBoot HealthEndpoint bean throws AmbiguousMethodCallException
Date Mon, 29 Feb 2016 16:27:18 GMT

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

Colin Harms updated CAMEL-9656:
-------------------------------
    Description: 
I'm trying to re-use the Springboot Actuator HealthEndpoint and InfoEndpoint beans and exposing
them via rest:
{code}
@Autowired
HealthEndpoint healthEndpoint;
...
//build the route
from("rest:get:health").routeId("REST-healthcheck").bean(healthEndpoint, "invoke");
{code}

However when that gets invoked, it throws a AmbiguousMethodCallException and its other candidate
for "invoke()" is on the abstract class that HealthEndpoint is extending

It looks like the issue is here:
https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java#L1020

In this case HealthEndpoint extends AbstractHealthEndpoint, which is abstract, but invoke()
is declared on the Endpoint interface. So this logic: 
{code} !isFromInterface && Modifier.isAbstract(info.getMethod().getModifiers()) {code}
Will not evaluate to true, and the abstract method will remain a candidate.

Here are the sources for the Endpoint/HealthEndpoint/AbstractEndpoint classes:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/Endpoint.java#L56

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java#L32

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/HealthEndpoint.java#L36

It seems this is intentional, due to the "if the class is an interface then keep the method"
comment in BeanInfo.
I'm curious as to why that is.

  was:
I'm trying to re-use the Springboot Actuator HealthEndpoint and InfoEndpoint beans and exposing
them via rest:
{code}
@Autowired
HealthEndpoint healthEndpoint;
...
//build the route
from("rest:get:health").routeId("REST-healthcheck").bean(healthEndpoint, "invoke");
{code}

However when that gets invoked, it throws a AmbiguousMethodCallException and its other candidate
for invoke is on the abstract class that HealthEndpoint is extending

It looks like the issue is here:
https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java#L1020

In this case HealthEndpoint extends AbstractHealthEndpoint, which is abstract, but invoke()
is declared on the Endpoint interface. So this logic: 
{code} !isFromInterface && Modifier.isAbstract(info.getMethod().getModifiers()) {code}
Will not evaluate to true, and the abstract method will remain a candidate.

Here are the sources for the Endpoint/HealthEndpoint/AbstractEndpoint classes:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/Endpoint.java#L56

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java#L32

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/HealthEndpoint.java#L36

It seems this is intentional, due to the "if the class is an interface then keep the method"
comment in BeanInfo.
I'm curious as to why that is.


> Using SpringBoot HealthEndpoint bean throws AmbiguousMethodCallException
> ------------------------------------------------------------------------
>
>                 Key: CAMEL-9656
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9656
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-spring-boot
>    Affects Versions: 2.16.2
>            Reporter: Colin Harms
>            Priority: Minor
>
> I'm trying to re-use the Springboot Actuator HealthEndpoint and InfoEndpoint beans and
exposing them via rest:
> {code}
> @Autowired
> HealthEndpoint healthEndpoint;
> ...
> //build the route
> from("rest:get:health").routeId("REST-healthcheck").bean(healthEndpoint, "invoke");
> {code}
> However when that gets invoked, it throws a AmbiguousMethodCallException and its other
candidate for "invoke()" is on the abstract class that HealthEndpoint is extending
> It looks like the issue is here:
> https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/component/bean/BeanInfo.java#L1020
> In this case HealthEndpoint extends AbstractHealthEndpoint, which is abstract, but invoke()
is declared on the Endpoint interface. So this logic: 
> {code} !isFromInterface && Modifier.isAbstract(info.getMethod().getModifiers())
{code}
> Will not evaluate to true, and the abstract method will remain a candidate.
> Here are the sources for the Endpoint/HealthEndpoint/AbstractEndpoint classes:
> https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/Endpoint.java#L56
> https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/AbstractEndpoint.java#L32
> https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/HealthEndpoint.java#L36
> It seems this is intentional, due to the "if the class is an interface then keep the
method" comment in BeanInfo.
> I'm curious as to why that is.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message