Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

banking-validation - Erro no put para invalidar a agencia

O acomapanhamento desse curso tem sido um pouco dificil devido a algumas divergencias. Não sei se tenho feito algo errado, mas no docker compose por exemplo, esta pegando uma imagem do repositório do docker. Fiz algumas alterações para rodar local o banking-service e estava funcionando bem, mas quando fui testar a comunicação do kafka, a chamada para o metodo inativarAgencia só me da "method not allowed". tive tambem alguns problemas com o banco de dados, mas acho que isso foi mais algum problema de ambiente... no fim, estou rodando os 2 serviços utilizados pela aula e mudei o endpoint

    @PUT
    @Transactional
    @Path("{cnpj}")
    public RestResponse<Void> inativarAgencia(Agencia agencia) {
        situacaoCadastralService.alterar(agencia);
        return RestResponse.ok();
    }

para remover o path, já que o parametro CNPJ nao é usado e bao estava funcionando antes

Eu não estou certo se perdi alguma parte da configuração, mas estou seguindo o conteudo teorico e na pratica estou fazendo os ajustes que preciso para rodar local pelo debbuger do intellij, no docker só estou rodando os bancos e o kafka.

O conteudo é interessante, mas a progressao tem sido acidentada e, posso estar errado, mas tenho achado bem atrapalhado seguir o que é passado com o que foi dado de material inicial. Alguem mais iniciante pode ter problemas para acompanhar o curso

4 respostas

Ola!

O erro “Method Not Allowed” (405) acontece porque o client tá fazendo a requisição para um endpoint que não aceita o método HTTP usado (no caso, PUT).

Motivo provável: como você removeu o @Path("{cnpj}"), o endpoint mudou. Se antes era, por exemplo, /agencias/{cnpj}, agora é só /agencias. Se o front, o teste ou outro serviço ainda tenta chamar /agencias/{cnpj}, vai dar 405.

Verifica:

  • Se o endpoint no client/teste está correto e sem o /cnpj.
  • Se o método realmente precisa desse parâmetro na URL. Se não usa, então a remoção está certa, mas o client precisa ser ajustado.

Se quiser, envia:

  1. O endpoint que você está chamando (URL completa).
  2. Código completo no github

amigo, entendo como funciona.. mas nao deu 405 por eu ter mudado o endopint, eu mudei o endpoint porque estava dando 405, como expliquei no post

solução!

Part 1 (até o fim da aula 4): fiz algumas alterações para rodar o banking validation no docker e o baking-service no intellij localmente...

alteração do endpoint do banking-validation (SituacaoCadastralController):

package br.com.alura;

import jakarta.transaction.Transactional;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import org.jboss.resteasy.reactive.RestResponse;

import java.util.List;

@Path("/situacao-cadastral")
public class SituacaoCadastralController {

    private final SituacaoCadastralRepository situacaoCadastralRepository;
    private final SituacaoCadastralService situacaoCadastralService;

    SituacaoCadastralController(SituacaoCadastralRepository situacaoCadastralRepository,
                                SituacaoCadastralService situacaoCadastralService) {
        this.situacaoCadastralRepository = situacaoCadastralRepository;
        this.situacaoCadastralService = situacaoCadastralService;
    }

    @POST
    @Transactional
    public void cadastrar(Agencia agencia) {
        this.situacaoCadastralRepository.persist(agencia);
    }

    @GET
    public List<Agencia> buscarTodos() {
        return this.situacaoCadastralRepository.findAll().stream().toList();
    }

    @GET
    @Path("{cnpj}")
    public RestResponse<Agencia> buscarPorCnpj(String cnpj) {
        Agencia agencia = this.situacaoCadastralRepository.findByCnpj(cnpj);
        if (agencia != null) {
            return RestResponse.ok(agencia);
        } return RestResponse.noContent();
    }

    @PUT
    @Transactional
    public RestResponse<Void> inativarAgencia(Agencia agencia) {
        situacaoCadastralService.alterar(agencia);
        return RestResponse.ok();
    }
}

criei o Dockerfile :

FROM maven:3.9.6-eclipse-temurin-21 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src

# Gera o uber-jar com Main-Class no manifest
RUN mvn clean package -DskipTests -Dquarkus.package.type=uber-jar

FROM eclipse-temurin:21-jre-jammy
WORKDIR /app

# Copia o jar correto (uber-jar com Main-Class)
COPY --from=build /app/target/banking-validation-1.0.0-SNAPSHOT-runner.jar .

# Baixa o wait-for-it.sh e dá permissão
RUN apt-get update && apt-get install -y curl && \
    curl -o /wait-for-it.sh https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh && \
    chmod +x /wait-for-it.sh && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

CMD ["java", "-jar", "banking-validation-1.0.0-SNAPSHOT-runner.jar"]

e mudei o .dockerignore:

#*
#!target/*-runner
#!target/*-runner.jar
#!target/lib/*
#!target/quarkus-app/*

Parte 2: docker-compose:

version: "3.8"

services:
  banking-validation:
    build:
      context: .
      dockerfile: Dockerfile
    image: rgdp/banking-validation:v1
    container_name: banking-validation-container
    environment:
      - QUARKUS_KAFKA_HOST=kafka-alura
      - QUARKUS_KAFKA_PORT=9092
      - QUARKUS_DATASOURCE_USERNAME=joao
      - QUARKUS_DATASOURCE_PASSWORD=joao
      - QUARKUS_DATASOURCE_HOST=postgres-db-alura
      - QUARKUS_DATASOURCE_PORT=5432
    ports:
      - 8181:8181
    depends_on:
      - postgres-db-alura
      - kafka-alura
    entrypoint:
      - /bin/sh
      - -c
      - |
        /wait-for-it.sh postgres-db-alura:5432 --timeout=60 --strict -- echo "Postgres is up"
        exec java -jar banking-validation-1.0.0-SNAPSHOT-runner.jar

  postgres-db-alura:
    image: postgres:14
    container_name: postgres-db-alura-container
    environment:
      - POSTGRES_USER=joao
      - POSTGRES_PASSWORD=joao
      - POSTGRES_DB=agencia
      - POSTGRES_HOST_AUTH_METHOD=md5
    ports:
      - 5434:5432
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

  zookeeper-alura:
    image: confluentinc/cp-zookeeper:latest
    container_name: zookeeper-alura
    restart: always
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka-alura:
    image: confluentinc/cp-kafka:7.4.3
    container_name: kafka-alura
    restart: always
    ports:
      - "9092:9092"
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-alura:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-alura:9092,PLAINTEXT_HOST://localhost:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:9094
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    depends_on:
      - zookeeper-alura

  kafka-topic-creator:
    image: confluentinc/cp-kafka:7.4.3
    container_name: kafka-topic-creator
    depends_on:
      - kafka-alura
    entrypoint:
      - /bin/sh
      - -c
      - |
        for i in $(seq 1 30); do
          kafka-topics --bootstrap-server kafka-alura:9092 --list && break
          echo "Esperando Kafka ficar disponível... tentativa $i"
          sleep 2
        done
        kafka-topics --bootstrap-server kafka-alura:9092 --create --replication-factor 1 --partitions 1 --topic remover-agencia || true
        echo "Tópico criado ou já existe. Saindo..."

volumes:
  postgres_data:
    driver: local

dessa forma, quando da o docker compose up --build -d vai subir a aplicação com a imagem da minha maquia, criar o topico, e nao precisa reiniciar o pod do banking validation porque o pod do banco ainda não esta pronto para conexão.

Tambem mudei o application propertie do bankin-service para :

quarkus.rest-client.situacao-cadastral-api.url=http://${QUARKUS_CLIENT_HTTP:localhost}:${QUARKUS_CLIENT_HTTP_PORT:8181}

quarkus.datasource.db-kind = postgresql
quarkus.datasource.username = ${QUARKUS_DATASOURCE_USERNAME:joao}
quarkus.datasource.password = ${QUARKUS_DATASOURCE_PASSWORD:joao}
#quarkus.datasource.jdbc.url = jdbc:postgresql://${QUARKUS_DATASOURCE_HOST:localhost}:${QUARKUS_DATASOURCE_PORT:5433}/agencia
#quarkus.datasource.jdbc.reactive.url = jdbc:postgresql://localhost:5433/agencia
quarkus.datasource.reactive.url=postgresql://localhost:5433/agencia


quarkus.micrometer.export.prometheus.path=/metrics
quarkus.datasource.devservices.enabled=false

#kafka.bootstrap.servers=${QUARKUS_KAFKA_SERVER:localhost}:${QUARKUS_KAFKA_PORT:9092}
kafka.bootstrap.servers=localhost:9094
mp.messaging.incoming.banking-service-channel.connector=smallrye-kafka
mp.messaging.incoming.banking-service-channel.topic=remover-agencia
mp.messaging.incoming.banking-service-channel.group.id=remover-agencia-consumer-group
mp.messaging.incoming.banking-service-channel.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
mp.messaging.incoming.banking-service-channel.auto.offset.reset=earliest

quarkus.kafka.devservices.enabled=false

que agora o kafka esta conectando na porta 9094 pelo localhost.

com isso, consigo rodar o banking-service pelo intellij, e funcionando com o banking-validation no docker, com a rota do inativarAgencia funcionando... Insira aqui a descrição dessa imagem para ajudar na acessibilidade

nota importante: essas alterações são só para motivo de estudo e não devem ser utilizadas dessa forma.. estava apenas focando em continuar o curso da forma que queria, não seguindo as melhores praticas