2
respostas

[Bug] Erro ao final da aula 3

Ao tentar executar o projeto banking-validation ao final da aula 3 eu estou com o erro:

2025-07-11 12:17:49,246 INFO  [io.qua.dep.dev.IsolatedDevModeMain] (main) Attempting to start live reload endpoint to recover from previous Quarkus startup failure
2025-07-11 12:17:49,808 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (main) Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
    [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: jakarta.enterprise.inject.spi.DeploymentException: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.clients.producer.KafkaProducer<java.lang.String, java.lang.String> and qualifiers [@Default]
    - injection target: parameter 'producer' of br.com.alura.KafkaConfiguration constructor
    - declared on CLASS bean [types=[br.com.alura.KafkaConfiguration, java.lang.Object], qualifiers=[@Default, @Any], target=br.com.alura.KafkaConfiguration]
    at io.quarkus.arc.processor.BeanDeployment.processErrors(BeanDeployment.java:1551)
    at io.quarkus.arc.processor.BeanDeployment.init(BeanDeployment.java:338)
    at io.quarkus.arc.processor.BeanProcessor.initialize(BeanProcessor.java:167)
    at io.quarkus.arc.deployment.ArcProcessor.validate(ArcProcessor.java:490)
    at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
    at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:856)
    at io.quarkus.builder.BuildContext.run(BuildContext.java:256)
    at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
    at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
    at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
    at java.base/java.lang.Thread.run(Thread.java:1583)
    at org.jboss.threads.JBossThread.run(JBossThread.java:483)
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type org.apache.kafka.clients.producer.KafkaProducer<java.lang.String, java.lang.String> and qualifiers [@Default]
    - injection target: parameter 'producer' of br.com.alura.KafkaConfiguration constructor
    - declared on CLASS bean [types=[br.com.alura.KafkaConfiguration, java.lang.Object], qualifiers=[@Default, @Any], target=br.com.alura.KafkaConfiguration]
    ...

Minha classe KafkaConfiguration:

package br.com.alura;

import io.quarkus.logging.Log;
import jakarta.enterprise.context.ApplicationScoped;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;
import org.eclipse.microprofile.config.Config;

import java.util.Properties;

@ApplicationScoped
public class KafkaConfiguration {

    private final KafkaProducer<String, String> producer;

    public KafkaConfiguration(Config config, KafkaProducer<String, String> producer) {
        String kafkaHost = config.getValue("producer.kafka.host", String.class);
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaHost);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        this.producer = new KafkaProducer<>(props);
    }

    public void enviarMensagem(String topico, String mensagem) {
        ProducerRecord<String, String> record = new ProducerRecord<>(topico, mensagem);
        producer.send(record, (metadata, exception) -> {
            if (exception == null) {
                Log.info("Mensagem enviada: " + metadata.offset());
            } else {
                Log.error("Erro: " + exception.getMessage());
                exception.getStackTrace();
            }
        });
    }
}
2 respostas

Olá Cleyton! Como vai?

O erro "Unsatisfied dependency" indica que o Quarkus não conseguiu resolver a dependência para o KafkaProducer no seu projeto. Vou listar algumas sugestões para tentar resolver esse problema:

  1. Produzir o KafkaProducer manualmente: Em vez de tentar injetar o KafkaProducer diretamente, você pode criar um método produtor para ele. Isso pode ajudar a Quarkus a resolver a dependência corretamente. Veja um exemplo de como você pode fazer isso:

    package br.com.alura;
    
    import io.quarkus.logging.Log;
    import jakarta.enterprise.context.ApplicationScoped;
    import jakarta.enterprise.inject.Produces;
    import org.apache.kafka.clients.producer.KafkaProducer;
    import org.apache.kafka.clients.producer.ProducerConfig;
    import org.apache.kafka.clients.producer.ProducerRecord;
    import org.apache.kafka.common.serialization.StringSerializer;
    import org.eclipse.microprofile.config.Config;
    
    import java.util.Properties;
    
    @ApplicationScoped
    public class KafkaConfiguration {
    
        private final Config config;
    
        public KafkaConfiguration(Config config) {
            this.config = config;
        }
    
        @Produces
        public KafkaProducer<String, String> createKafkaProducer() {
            String kafkaHost = config.getValue("producer.kafka.host", String.class);
            Properties props = new Properties();
            props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaHost);
            props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
            props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
            return new KafkaProducer<>(props);
        }
    
        public void enviarMensagem(String topico, String mensagem) {
            KafkaProducer<String, String> producer = createKafkaProducer();
            ProducerRecord<String, String> record = new ProducerRecord<>(topico, mensagem);
            producer.send(record, (metadata, exception) -> {
                if (exception == null) {
                    Log.info("Mensagem enviada: " + metadata.offset());
                } else {
                    Log.error("Erro: " + exception.getMessage());
                    exception.getStackTrace();
                }
            });
        }
    }
    
  2. Verificar as dependências no pom.xml: Certifique-se de que você tem as dependências corretas para o Kafka e o Quarkus no seu pom.xml. Você pode precisar da dependência quarkus-smallrye-reactive-messaging-kafka para integrar o Kafka com o Quarkus.

  3. Configuração do Kafka: Verifique se todas as configurações necessárias do Kafka estão corretamente definidas no seu arquivo de configuração application.properties ou application.yaml.

Espero que essas sugestões ajudem a resolver o problema que você está enfrentando.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Olá, Armano,

O que funcionou mesmo foi a solução 1. Produzir o KafkaProducer manualmente

Só não entendo como isso pode funcionar para o professor durante os videos, estando na mesma versão de Quarkus, java, etc... e para mim não.

Cleyton