image

Bootcamps ilimitados + curso de inglês para sempre

80
%OFF
Article image
Fernanda Araujo
Fernanda Araujo24/06/2025 14:09
Compartilhe

Construindo APIs Modernas e Inteligentes: com Violet Evergarden

  • #Java

Introdução

Integrar modelos de Inteligência Artificial (IA) em aplicações Java é uma demanda crescente no mercado de software moderno. Java, conhecido por sua robustez e portabilidade, pode agora ser potencializado com recursos inteligentes que elevam o nível de automação, análise e tomada de decisão das aplicações. Neste artigo, vamos explorar como integrar IA em aplicações Java de forma eficiente, segura e com código limpo.

Além do conteúdo técnico, este artigo combina teoria com uma narrativa inspirada no anime Violet Evergarden. A proposta é tornar o aprendizado mais intuitivo e envolvente.

A cada seção, você encontrará uma explicação prática com código, seguida de um exemplo narrativo onde Violet representa o papel de um sistema de APIs corporativas, enviando “cartas” que conectam dados e pessoas, como as APIs conectam sistemas e usuários.

Essa analogia ajudará a visualizar como uma API bem estruturada, segura e inteligente pode atuar como uma ponte entre mundos — assim como Violet, que escreve mensagens com propósito, clareza e sentimento.

image

🔹 Java 24 moderno com features avançadas

Java 24 introduz recursos que modernizam o desenvolvimento, como threads virtuais (Project Loom), pattern matching e records, que reduzem a verbosidade do código e aumentam a legibilidade.

Com essas melhorias, é possível escrever APIs mais leves, performáticas e concisas, tornando o backend mais sustentável e fácil de manter.

✉️ Analogicamente com Violet:

Imagine que Violet agora escreve centenas de cartas por dia para conectar diferentes pessoas — de forma rápida, clara e sem erros. Para isso, ela precisa de threads leves, modelos padronizados de mensagem e decisão eficiente sobre o conteúdo da carta.

Exemplo de código (usando record + pattern matching + threads virtuais):

// Um modelo simples de carta: Violet usa um record para representar uma mensagem
record Carta(String destinatario, String conteudo) {}

// Violet decide o tipo da mensagem com pattern matching
void escreverCarta(Object pedido) {
  if (pedido instanceof Carta carta) {
      System.out.println("Escrevendo para: " + carta.destinatario());
  }
}

// Threads virtuais: Violet pode escrever várias cartas ao mesmo tempo
Runnable tarefa = () -> escreverCarta(new Carta("Major", "Sinto sua falta."));
Thread.startVirtualThread(tarefa);

Esse exemplo mostra como os recursos do Java 24 permitem que Violet, como analogia de um sistema moderno de APIs, escreva e envie mensagens (requisições) com eficiência e clareza, sem sobrecarregar o sistema.

🔹 Por que integrar IA em aplicações Java?

Java é uma linguagem amplamente adotada em sistemas corporativos, consolidada pela sua robustez e portabilidade. Isso a torna ideal para projetos que exigem escalabilidade e alta disponibilidade.

Além disso, muitas bibliotecas de IA disponibilizam APIs RESTful ou SDKs que se integram facilmente com Java. Isso facilita a incorporação de funcionalidades inteligentes sem grandes complicações técnicas.

Integrar IA permite criar APIs mais inteligentes, capazes de responder com maior autonomia e oferecer experiências personalizadas aos usuários. Essa evolução eleva o nível dos sistemas desenvolvidos.

Com essa capacidade, o backend Java pode ser utilizado para diversas aplicações, desde chatbots interativos até sistemas complexos de recomendação, abrindo portas para soluções inovadoras no mercado.

✉️ Analogicamente com Violet:

Após a guerra, Violet teve que aprender algo novo: entender sentimentos e traduzi-los em palavras. Assim como uma IA, ela analisa o que é dito — e também o que é sentido — para gerar uma resposta precisa e empática.

Nesse contexto, a IA funciona como o “coração adicional” de Violet. Ela ajuda a interpretar dados e formular mensagens personalizadas. No mundo das APIs, é isso que a IA faz: ela entende e responde com inteligência.

Exemplo de código: Violet com IA integrada

// Serviço que simula Violet escrevendo uma carta com apoio da IA
@Service
public class VioletIAService {

  private final IAModelo modelo;

  public VioletIAService(IAModelo modelo) {
      this.modelo = modelo; // pode ser OpenAI, Hugging Face etc.
  }

  public String escreverCarta(String sentimento) {
      // IA ajuda Violet a encontrar as palavras certas
      return modelo.gerarTexto("Transforme este sentimento em palavras: " + sentimento);
  }
}

// Interface genérica para IA (abstração do modelo)
public interface IAModelo {
  String gerarTexto(String prompt);
}

Essa estrutura permite que Violet use diferentes modelos de IA sem mudar seu jeito de escrever cartas. É como se ela pudesse pedir conselhos a qualquer especialista — e adaptar seu tom de voz conforme o destinatário.

🔹 Tecnologias modernas para IA em Java

Para criar aplicações Java modernas com IA, usamos várias tecnologias que facilitam o desenvolvimento e a integração:

  • Java 24: suporte a threads virtuais, records e pattern matching, tornando o código mais conciso e eficiente.
  • Spring Boot 3: maximiza a produtividade por meio de configuração automática e APIs REST.
  • Spring Data JPA: simplifica a persistência e reduz o boilerplate.
  • OpenAPI (Swagger): documenta automaticamente a API e facilita testes.
  • Railway (Ferrovia): fornece deploy, banco de dados e CI/CD integrados.
  • Spring AI: permite integrar modelos de IA como OpenAI e Hugging Face com facilidade.

Essas tecnologias tornam a integração de IA em Java mais acessível, eficiente e elegante.

🔹 Paradigmas e padrões

  • POO: para estrutura e organização de entidades, seguindo princípios como responsabilidade única e SOLID.
  • Funcional: para lógica de transformação com Stream API, Optional e imutabilidade.
  • DTOs e Builders: para transporte limpo de dados.
  • Command e Strategy Patterns: para modularizar comportamentos como chamadas a diferentes modelos de IA.

✉️ Analogicamente com Violet:

Violet seguia regras muito rígidas em sua rotina: organização, responsabilidade e execução impecável — assim como a Programação Orientada a Objetos define classes bem estruturadas com responsabilidades únicas.

Ao mesmo tempo, Violet também aprendeu a adaptar a linguagem da carta conforme o sentimento e o contexto. Isso se assemelha à Programação Funcional, onde funções puras transformam dados com elegância e sem efeitos colaterais.

Como uma ghostwriter eficiente, Violet usava moldes (DTOs e Builders) para transformar sentimentos em mensagens formais. Já o Strategy Pattern lembra sua habilidade de mudar o estilo de escrita conforme a pessoa que recebia a carta.

Exemplo de código com paradigmas aplicados na “Agência de Cartas Violet”

// DTO: molde da carta enviada
public record CartaDTO(String destinatario, String conteudo) {}

// Builder para criar cartas de forma limpa
public class CartaBuilder {
  private String destinatario;
  private String conteudo;

  public CartaBuilder destinatario(String d) {
      this.destinatario = d;
      return this;
  }

  public CartaBuilder conteudo(String c) {
      this.conteudo = c;
      return this;
  }

  public CartaDTO build() {
      return new CartaDTO(destinatario, conteudo);
  }
}

// Strategy Pattern: diferentes estilos de escrita (ex: formal, emocional, técnico)
public interface EstiloDeEscrita {
  String escrever(String sentimento);
}

public class EstiloFormal implements EstiloDeEscrita {
  public String escrever(String sentimento) {
      return "Com os mais respeitosos cumprimentos, " + sentimento;
  }
}

public class EstiloEmocional implements EstiloDeEscrita {
  public String escrever(String sentimento) {
      return "Do fundo do meu coração, eu sinto: " + sentimento;
  }
}

// Uso no serviço principal
public class AgenciaDeCartas {
  private final EstiloDeEscrita estilo;

  public AgenciaDeCartas(EstiloDeEscrita estilo) {
      this.estilo = estilo;
  }

  public CartaDTO criarCarta(String destinatario, String sentimento) {
      String conteudo = estilo.escrever(sentimento);
      return new CartaBuilder()
          .destinatario(destinatario)
          .conteudo(conteudo)
          .build();
  }
}

Essa estrutura mostra como Violet poderia alternar entre diferentes estilos de escrita — de forma organizada, reutilizável e clara — aplicando na prática os paradigmas POO, funcional e padrões como Strategy e Builder.

🔹 Por que POO + Funcional é uma ótima combinação

Quando combinados, POO e programação funcional permitem uma base sólida com estrutura clara, além de lógica enxuta e concisa.

Essa abordagem facilita testes, debug, legibilidade e manutenção. É amplamente adotada em frameworks modernos como Spring, Micronaut e Quarkus.

🔹 Código enxuto: estratégias para simplicidade

Para manter o código limpo e curto:

  • Use record para definir DTOs.
  • Crie serviços com responsabilidade única.
  • Centralize lógica comum usando funções puras.
  • Evite lógica duplicada; prefira reutilização.
  • Aplique princípios de baixo acoplamento.

🔹 Como funciona a integração com IA

Passo 1: Escolher o modelo de IA

  • OpenAI (ChatGPT, DALL·E, Whisper)
  • Hugging Face Transformers
  • Modelos locais via ONNX ou TensorFlow

Passo 2: Criar um serviço Java para consumir o modelo

Passo 3: Encapsular a lógica de IA em um serviço

✉️ Analogicamente com Violet:

Antes de escrever uma carta, Violet sempre escutava a história do cliente com atenção. Dependendo do sentimento envolvido — amor, saudade, perdão — ela decidia qual estilo usar.

Isso é como escolher um modelo de IA: cada um tem uma habilidade distinta. Uns são melhores com linguagem formal, outros criam imagens, e há os que geram respostas em tempo real.

Depois de escolher o “modelo”, Violet escreve com base em um prompt (sentimento ou pedido). Ela envia isso como uma requisição, recebe a resposta e transforma em uma carta personalizada.

Exemplo de código: Violet como integradora de modelos

public interface ModeloDeCarta {
  String gerarConteudo(String prompt);
}

// Várias IAs = vários estilos da Violet
public class VioletComOpenAI implements ModeloDeCarta {
  public String gerarConteudo(String prompt) {
      // Simula chamada real
      return "OpenAI respondeu: " + prompt;
  }
}

public class VioletComHuggingFace implements ModeloDeCarta {
  public String gerarConteudo(String prompt) {
      return "HuggingFace respondeu: " + prompt;
  }
}

// Serviço onde Violet usa o modelo escolhido para escrever
public class VioletIAService {

  private final ModeloDeCarta modelo;

  public VioletIAService(ModeloDeCarta modelo) {
      this.modelo = modelo;
  }

  public String escreverCarta(String sentimento) {
      return modelo.gerarConteudo("Transforme este sentimento: " + sentimento);
  }
}

Com essa arquitetura, Violet pode alternar entre modelos de IA conforme o tipo de carta — mantendo sua essência, mas adaptando o tom. Isso mostra como abstrair a IA é útil para APIs Java que precisam evoluir sem perder estabilidade.

🔹 Arquitetura da API com IA integrada

  • Camada controller (REST)
  • Camada service (lógica de negócio + IA)
  • Camada repository (Spring Data JPA)
  • DTOs com record para transporte de dados
  • Hexagonal (Ports & Adapters) ou camadas tradicionais (Controller → Service → Domain → Infra)

➡️ Isso desacopla sua lógica da IA, da rede, de banco, de frameworks, etc.

✉️ Analogicamente com Violet:

Na agência postal, Violet não trabalha sozinha: há quem receba os pedidos (Controller), quem interprete os sentimentos (Service), quem armazene as cartas escritas (Repository) e quem transporte os dados com cuidado (DTOs).

A arquitetura é como a rotina dela: cada parte da operação tem uma função clara. Isso permite que Violet foque no que faz de melhor — traduzir sentimentos — sem se preocupar com entrega ou armazenamento.

Exemplo de código: Arquitetura da “Agência de Cartas Violet Evergarden”

// DTO como record: a carta que será transportada
public record CartaDTO(String destinatario, String conteudo) {}

// Repository: simula um banco de dados com Spring Data JPA
@Repository
public interface CartaRepository extends JpaRepository<CartaEntity, Long> {}

// Service: onde Violet transforma sentimento em carta com ajuda da IA
@Service
public class VioletService {

  private final ModeloDeCarta ia;
  private final CartaRepository repo;

  public VioletService(ModeloDeCarta ia, CartaRepository repo) {
      this.ia = ia;
      this.repo = repo;
  }

  public CartaDTO escrever(String sentimento, String destinatario) {
      String conteudo = ia.gerarConteudo(sentimento);
      CartaEntity carta = new CartaEntity(destinatario, conteudo);
      repo.save(carta);
      return new CartaDTO(destinatario, conteudo);
  }
}

// Controller: ponto de entrada da API (cliente faz o pedido)
@RestController
@RequestMapping("/cartas")
public class CartaController {

  private final VioletService service;

  public CartaController(VioletService service) {
      this.service = service;
  }

  @PostMapping
  public CartaDTO criar(@RequestBody PedidoCarta pedido) {
      return service.escrever(pedido.sentimento(), pedido.destinatario());
  }
}

Com essa arquitetura modular, Violet consegue manter sua rotina organizada: cada parte da aplicação tem uma única responsabilidade, seguindo o princípio da separação de preocupações.

Assim como na agência de Violet, essa estrutura permite escalar, manter e evoluir seu sistema com segurança e clareza.

🔹 Segurança (nível enterprise)

Em APIs robustas e conectadas com IA, segurança não é opcional — é um pilar. As boas práticas incluem:

  • JWT com roles (ex: USER, ADMIN)
  • Validação com anotações como @Valid
  • Rate limiting com Bucket4j ou Redis
  • Proteção com CORS, headers e HTTPS
  • Logs controlados sem expor dados sensíveis

✉️ Analogicamente com Violet:

As cartas que Violet escrevia eram, muitas vezes, profundamente íntimas. Algumas envolviam segredos de Estado. Para isso, ela precisava garantir que só o destinatário correto pudesse abrir a carta — como se usasse autenticação com tokens e autorização por perfil.

Ela também filtrava pedidos, evitando spam e abusos — como uma API segura com rate limiting. Suas cartas tinham carimbos oficiais e não podiam ser interceptadas no caminho — assim como HTTPS e CORS protegem os dados em trânsito.

Exemplo de código: Segurança na API de Violet

// DTO de entrada com validação de campos
public record PedidoCarta(
  @NotBlank String destinatario,
  @Size(min = 10) String sentimento
) {}

// Controller protegido por roles com JWT
@RestController
@RequestMapping("/cartas")
public class CartaController {

  @PreAuthorize("hasRole('USER')")
  @PostMapping
  public CartaDTO criar(@Valid @RequestBody PedidoCarta pedido, Authentication auth) {
      String autor = auth.getName(); // remetente autenticado
      return service.escrever(pedido.sentimento(), pedido.destinatario());
  }
}

// Configuração básica de segurança com CORS e JWT
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
      return http
          .cors().and()
          .csrf().disable()
          .authorizeHttpRequests(auth -> auth
              .requestMatchers("/cartas/**").authenticated()
              .anyRequest().permitAll())
          .oauth2ResourceServer(oauth2 -> oauth2.jwt())
          .build();
  }
}

// Exemplo de rate limiting com Bucket4j
@Bean
public Filter rateLimiterFilter() {
  return (request, response, chain) -> {
      Bucket bucket = Bucket4j.builder()
          .addLimit(Bandwidth.classic(10, Refill.intervally(10, Duration.ofMinutes(1))))
          .build();

      if (bucket.tryConsume(1)) {
          chain.doFilter(request, response);
      } else {
          ((HttpServletResponse) response).setStatus(429);
      }
  };
}

Violet entendia que confiança é construída com proteção. Esse mesmo princípio se aplica à sua API: protegida, validada, autorizada e preparada para resistir a abusos sem comprometer a missão — conectar pessoas com inteligência e segurança.

🔹 Deploy e monitoração com Railway

  • Push no GitHub aciona build e deploy automático
  • Banco de dados como serviço
  • Painel de logs e variáveis de ambiente
  • Ambiente integrado para testes, staging e produção

🔹 Documentação Swagger/OpenAPI bem feita

A documentação com Swagger (OpenAPI) permite descrever cada endpoint da API de forma clara, interativa e testável, facilitando o trabalho de desenvolvedores e integradores.

Uma documentação bem feita reduz erros de integração, melhora a comunicação entre equipes e acelera o desenvolvimento de clientes front-end.

🔹 Abstração da IA (trocar OpenAI por outro sem quebrar o sistema)

Ao encapsular a lógica de IA em um serviço bem definido, você pode trocar o provedor de IA (como OpenAI) por outro (como Hugging Face ou Azure AI) sem precisar reescrever a aplicação.

Esse desacoplamento segue boas práticas de arquitetura, como injeção de dependência e baixo acoplamento.

Conclusão

A integração de inteligência artificial deixou de ser tendência e passou a ser uma necessidade urgente em aplicações modernas.

Java continua sendo a linguagem dominante no backend corporativo, graças à sua estabilidade, escalabilidade e ecossistema maduro.

Unir a robustez do Java com modelos de IA, aplicando boas práticas de código e arquitetura, é um diferencial técnico altamente valorizado.

Com a abordagem apresentada, é possível criar uma API moderna, segura, inteligente e adaptável a qualquer tipo de sistema ou negócio.

Além disso, escrever boas documentações dos seus projetos é tão importante quanto escrever o código em si. E mais: ler a documentação oficial do Java, do Spring e das bibliotecas de IA é o que te dá autonomia para criar, inovar e resolver problemas reais com eficiência.

🕊️ Analogicamente com Violet

Violet sabia que uma carta mal escrita poderia ser mal interpretada. Por isso, ela escolhia cuidadosamente cada palavra, pontuação e assinatura — como se estivesse criando a documentação de um sistema para que outro desenvolvedor pudesse entendê-lo sem dúvidas.

Da mesma forma, escrever a documentação da sua API é garantir que suas intenções sejam compreendidas, que o sistema seja reutilizado, ampliado e mantido sem ruídos.

E ler documentações — como Violet lia os registros das pessoas antes de escrever — é uma forma de respeitar o conhecimento que já existe e aprimorar sua escrita técnica.

No fim, tanto no código quanto nas palavras, documentar é conectar.

image

🔗 Referências

Gostou do artigo? Deixe seu comentário com dúvidas, sugestões ou experiências sobre Java, IA e APIs.

Compartilhe este conteúdo com a comunidade para que mais devs possam aprender e trocar dicas valiosas.

Juntos, vamos construir uma rede de conhecimento forte e colaborativa! 🚀

Compartilhe
Recomendados para você
NTT DATA - Java e IA para Iniciantes
TONNIE - Java and AI in Europe
Deal - Spring Boot e Angular (17+)
Comentários (5)
Fernanda Araujo
Fernanda Araujo - 07/07/2025 03:45

Fico grata pelo apoio e os feedbacks!! 👩‍💻🔛🤖

Vejo a integração de IA com Java crescendo forte (criando uma evolução tecnológica), especialmente em automação inteligente e análise de dados corporativos, abrindo muitas oportunidades para soluções mais ágeis e escaláveis.

O maior desafio está na complexidade da integração e no consumo de recursos, que pode impactar a performance. A escolha entre inferência local e chamadas a APIs externas depende muito do equilíbrio entre custo, latência e controle sobre os dados, além da escalabilidade do projeto. Frameworks como Spring AI e LangChain4j são promissores para facilitar essa integração e trazem mais flexibilidade ao desenvolvimento.


Marcio Gil
Marcio Gil - 04/07/2025 22:07

Obrigado pelo artigo claro e inspirador! Sua abordagem prática ao demonstrar a integração de IA em APIs Java especialmente com o exemplo da OpenAI tornou o tema acessível e motivador para muitos desenvolvedores.

Gostei como você destacou o uso do HttpClient nativo, a proteção da chave de API e o tratamento de erros como pontos cruciais. Além disso, ao citar bibliotecas como TensorFlow Java, DJL, Weka e Deeplearning4j, você mostrou a versatilidade da plataforma Java na IA dev.to+8dio.me+8dio.me+8.

Você mencionou bibliotecas como DJL e Weka, além do uso de APIs externas como a da OpenAI. Pensando em projetos Java que precisem funcionar off-line ou com menos dependência de APIs externas, você já experimentou usar modelos embarcados com DJL ou TensorFlow Java? Quais desafios você vê nessa abordagem, tanto em termos de performance, quanto na complexidade de integração?

Você consideraria integrar frameworks como Spring AI ou LangChain4j, ou ainda recorrer ao treinamento e execução de modelos localmente com DJL/TensorFlow? Seria interessante conhecer seu ponto de vista sobre o trade-off entre chamadas externas à API versus inferência local, em termos de desempenho, custo e governança de dados.

Fernando Araujo
Fernando Araujo - 03/07/2025 15:10

Uhuuuuuuuuuuuuuuuu!!!!!!!!!!!!!!

Parabéns, xará!!!!

Ótimo artigo! Mereceu o prêmio!!!!

Luiz Café
Luiz Café - 03/07/2025 14:52

Parabéns Fernanda! Seu artigo ficou ótimo! Sucesso na sua caminhada!

DIO Community
DIO Community - 25/06/2025 12:07

Excelente artigo, Fernanda! Você fez uma analogia brilhante entre a personagem Violet Evergarden e a criação de APIs inteligentes e eficientes, facilitando a compreensão de conceitos complexos. A forma como você explora a integração de IA com Java, utilizando as novas funcionalidades da linguagem e frameworks como Spring Boot, é extremamente relevante para quem busca inovar na criação de soluções robustas e escaláveis.

Na DIO, acreditamos que essa abordagem modular e adaptável, com foco na segurança, clareza e eficiência, é o caminho para a construção de sistemas de alta qualidade. Você mencionou várias boas práticas e ferramentas essenciais, como Spring Data JPA, Swagger e Railway, que são fundamentais para garantir uma arquitetura de API sólida.

Como você enxerga o futuro da integração de IA com Java em soluções corporativas? Quais oportunidades você acredita que vão surgir a partir dessa evolução tecnológica?