0

I am trying to override Ribbon Server List to get a list of host names from consul. I have the consul piece working properly(when testing with hardcode values) to get the hostname and port for a service. The issue I am having is when I try to autowire in IClientConfig. I get an exception that IClientConfig bean could not be found. How do I override the ribbon configurations and autowire IClientConfig in the ribbonServerList method.

I have tried following the instructions here at http://projects.spring.io/spring-cloud/spring-cloud.html#_customizing_the_ribbon_client on how to customize ribbon client configuration. I keep getting the following error: Description: Parameter 0 of method ribbonServerList in com.intradiem.enterprise.keycloak.config.ConsulRibbonSSLConfig required a bean of type 'com.netflix.client.config.IClientConfig' that could not be found. Which is causing spring-boot to fail. Bellow are the classes that I am trying to use to create AutoConfiguration Class:

@Configuration
@EnableConfigurationProperties
@ConditionalOnBean(SpringClientFactory.class)
@ConditionalOnProperty(value = "spring.cloud.com.intradiem.service.apirouter.consul.ribbon.enabled", matchIfMissing = true)
@AutoConfigureAfter(RibbonAutoConfiguration.class)
@RibbonClients(defaultConfiguration = ConsulRibbonSSLConfig.class)
//@RibbonClient(name = "question-answer-provider", configuration = ConsulRibbonSSLConfig.class)
public class ConsulRibbonSSLAutoConfig
{
}

Configuration Class:

@Component
public class ConsulRibbonSSLConfig
{
@Autowired
private ConsulClient client;

private String serviceId = "client";

public ConsulRibbonSSLConfig() {
}

public ConsulRibbonSSLConfig(String serviceId) {
    this.serviceId = serviceId;
}

@Bean
@ConditionalOnMissingBean
public ServerList<?> ribbonServerList(IClientConfig clientConfig) {
    ConsulSSLServerList serverList = new ConsulSSLServerList(client);
    serverList.initWithNiwsConfig(clientConfig);
    return serverList;
}
}

ServerList Code:

public class ConsulSSLServerList extends AbstractServerList<Server>
{
private final ConsulClient client;

private String serviceId = "client";

public ConsulSSLServerList(ConsulClient client) {
    this.client = client;
}

@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
    this.serviceId = clientConfig.getClientName();
}

@Override
public List<Server> getInitialListOfServers() {
    return getServers();
}

@Override
public List<Server> getUpdatedListOfServers() {
    return getServers();
}

private List<Server> getServers() {
    List<Server> servers = new ArrayList<>();
    Response<QueryExecution> results = client.executePreparedQuery(serviceId, QueryParams.DEFAULT);
    List<QueryNode> nodes = results.getValue().getNodes();
    for (QueryNode queryNode : nodes) {
        QueryNode.Node node = queryNode.getNode();
        servers.add(new Server(node.getMeta().containsKey("secure") ? "https" : "http", node.getNode(), queryNode.getService().getPort()));
    }
    return servers;
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("ConsulSSLServerList{");
    sb.append("serviceId='").append(serviceId).append('\'');
    sb.append('}');
    return sb.toString();
}
}
  • Remove `@Component` from `ConsulRibbonSSLConfig` – spencergibb Sep 14 '18 at 19:31
  • Removed @Component and the same exception is being thrown. – matt penna Sep 14 '18 at 19:36
  • That error is what happens when `ConsulRibbonSSLConfig` is picked up outside of the ribbon configuration. I don't know how else to help without a [complete, minimal, verifiable sample](https://stackoverflow.com/help/mcve) that reproduces the problem? It should be available as a GitHub (or similar) project or downloadable somewhere as a zip file. – spencergibb Sep 14 '18 at 20:04

0 Answers0