Tools
    codingcopilottoolsproductivity

    How does JetBrains AI Assistant handle Spring Boot and Kotlin compared to GitHub Copilot?

    Evaluates JetBrains AI Assistant specifically for JVM developers working with Java, Kotlin, and Spring Boot. Compares its deep IDE integration and type-aware refactoring against GitHub Copilot's general-purpose suggestions.

    Editor: Paul RadfordOct 11, 20269 min read
    How does JetBrains AI Assistant handle Spring Boot and Kotlin compared to GitHub Copilot?

    How Does JetBrains AI Assistant Handle Spring Boot and Kotlin Compared to GitHub Copilot?

    For Java and Kotlin developers working inside IntelliJ IDEA, JetBrains AI Assistant wins on anything that requires real type information: Spring bean wiring, Kotlin Multiplatform refactors, large mechanical Java migrations. GitHub Copilot wins on raw suggestion speed and on polyglot or frontend-heavy repos where IntelliJ's indexing advantage stops mattering. If your repo is mostly JVM code, pick JetBrains AI. If it's a mixed React, Python, and Go monorepo, Copilot or Cursor will serve you better.

    I spent a few months running both tools side by side on a mid-sized Spring Boot monolith (roughly 140,000 lines of Kotlin and Java, Gradle multi-module, Spring Boot 3.x with Spring Data JPA) and a smaller Kotlin Multiplatform project targeting JVM and iOS. The gap between the two tools is small on autocomplete and gets wide fast once you ask for structural changes.

    What does "deep IDE integration" actually buy you?

    JetBrains AI Assistant isn't bundled into IntelliJ by default. You install a plugin, need an AI Service subscription, and accept JetBrains's AI terms before it touches any code. That friction is worth knowing up front: it's not a flip-a-switch feature the way Copilot's inline completion is.

    What you get once it's running is access to IntelliJ's existing type solver, its PSI (program structure interface) tree, and its bytecode index: the same machinery that powers "Find Usages" and "Safe Delete." A suggestion from AI Assistant isn't pattern-matching on text, it's working from the same symbol table the IDE uses for its own deterministic refactoring tools. In practice that means:

    • Autocomplete that respects your actual constructor signatures, not a plausible-looking guess
    • Chat answers that can reference a specific class, file, or recent change as context
    • Agent mode that can plan multi-step changes, edit files, and run your test suite, then report back for review

    GitHub Copilot works primarily from the open buffer plus a retrieval window over the repo. It doesn't share IntelliJ's semantic index. The GitHub Copilot documentation describes this context model directly: suggestions come from open files, recently edited files, and retrieval over the repo, not from a persistently resolved type graph. Copilot still produces correct Spring code constantly, because Spring Boot patterns are heavily represented in training data, but it's reasoning from surface patterns and whatever context it can retrieve, not from a resolved dependency graph.

    Does JetBrains AI Assistant generate better Spring Boot boilerplate?

    Ask either tool to scaffold a new @RestController backed by a service and repository, and you'll get something usable in seconds. Copilot's inline suggestions, whether in VS Code or the JetBrains Copilot plugin, are often faster to appear, and for pure boilerplate, speed matters more than cleverness. The VS Code Copilot overview covers how those inline completions trigger as you type, which is exactly the experience you want for repetitive scaffolding.

    Where JetBrains AI Assistant pulls ahead is verification. Because it runs inside IntelliJ, every generated class gets real-time type checking, Spring-specific inspections (missing @Autowired candidates, ambiguous bean resolution, misconfigured @Transactional boundaries), and the Spring tool window reflects new beans immediately. You see problems as red squiggles the moment the code lands, not after a compile.

    A concrete example: asking for a new service with a constructor-injected JdbcTemplate and a custom RowMapper. Both tools wrote working code. AI Assistant's chat, when asked to "add this bean to the existing DataSourceConfig," correctly identified that DataSourceConfig already exposed a DataSource bean and wired the new service against it. Copilot, working from an open-file context window, duplicated the DataSource configuration in a new file because that file wasn't in its active context. That's not a Copilot bug so much as a structural consequence of not having a resolved dependency graph behind the suggestion.

    Kotlin Multiplatform: who actually tracks expect and actual correctly?

    Kotlin Multiplatform (KMP) projects stress-test type awareness because an expect/actual declaration has to stay consistent across commonMain, jvmMain, and iosMain source sets. Change a signature in commonMain and it needs to propagate correctly to every platform-specific actual.

    I tested this by changing an expect class PlatformDateFormatter signature to add a parameter. In IntelliJ, asking AI Assistant to "update all actual implementations to match" correctly found and edited both the JVM and iOS actuals, because IntelliJ's Kotlin plugin already resolves expect/actual relationships for its own refactoring tools and AI Assistant rides on that index.

    Copilot handled the JVM actual fine, since it was in the open editor group, but missed the iOS actual entirely on one run because that file lived in a different source set directory it hadn't been shown. I had to open the file manually and re-prompt. That's the pattern you see repeatedly: Copilot does well when the relevant files are already open or recently touched, and falls off when correctness depends on a project-wide relationship it hasn't seen.

    Neither tool handles Gradle KMP target configuration gracefully. If you're adding a new target such as wasmJs, do that part by hand and treat any AI-suggested build.gradle.kts block as a draft. Both tools have, in my testing, suggested plugin versions or DSL syntax that didn't match the project's actual Kotlin Gradle plugin version, which costs you a careful read every time.

    Enterprise Java migrations: the unglamorous, highest-value case

    The use case where AI Assistant earns its subscription cost is large, mechanical migration work: javax to jakarta namespace changes, moving from Spring Boot 2.x conventions to 3.x, or stripping deprecated WebSecurityConfigurerAdapter usage in favor of SecurityFilterChain beans.

    Because these migrations are fundamentally about finding every usage and transforming it consistently, having IntelliJ's structural search and "Find Usages" as the substrate for an AI agent makes a measurable difference. I asked AI Assistant's agent mode to migrate a WebSecurityConfigurerAdapter subclass across a module with six separate security configuration classes. It found all six, proposed the bean-based rewrite for each, and flagged two places where custom configure(HttpSecurity) overrides had project-specific logic needing manual review instead of silently guessing.

    Copilot, asked the same thing through chat, handled the single open file correctly but didn't go looking for the other five on its own. GitHub has been expanding Copilot's multi-file and agent capabilities, detailed on the GitHub Copilot features page, and those modes do real repo-wide work. But as of the versions I tested, Copilot still leans more on you pointing it at specific files or letting a cloud agent run an async task, rather than querying a live semantic index the way IntelliJ's refactoring engine does.

    A real dependency injection refactor, run three times each

    Here's the test worth running yourself before committing a JVM-heavy team to either tool. Take a Spring service whose constructor has grown to seven dependencies, a smell any reviewer would flag, and ask both tools to split it into two cohesive services and fix every call site.

    kotlin
    1@Service
    2class OrderProcessingService(
    3 private val orderRepository: OrderRepository,
    4 private val paymentGateway: PaymentGateway,
    5 private val inventoryService: InventoryService,
    6 private val notificationService: NotificationService,
    7 private val auditLogger: AuditLogger,
    8 private val pricingEngine: PricingEngine,
    9 private val fraudDetector: FraudDetector
    10)

    The ask: extract paymentGateway, fraudDetector, and auditLogger into a new PaymentProcessingService, inject that into OrderProcessingService, and fix every call site and test mock in the module.

    AI Assistant's agent mode completed this in one pass. It created the new service, moved the relevant methods, updated the constructor, and used real "Find Usages" results to locate and update three test classes that mocked OrderProcessingService directly plus one integration test that autowired it. It also noticed that a moved method still referenced pricingEngine, which stayed behind in the original class, and passed it as a parameter instead of moving it, avoiding a circular reference between the two new services.

    Copilot, given the same prompt with one file open, produced a clean extraction but missed two of the four affected test files because they weren't in its context window. Once I opened each one and re-prompted, it fixed the mocks correctly. The suggestion quality for the extraction itself was comparable between tools. The gap was entirely about automatic discovery of what needed to change.

    I repeated the test three times with each tool. Copilot caught the circular dependency risk on its own once out of three runs, suggesting a straight move that would have failed at compile time the other two times. AI Assistant caught it twice out of three. Small sample, but it tracks with the structural advantage: a tool with the actual dependency graph is more likely to notice graph problems, though neither is infallible.

    Where does JetBrains AI Assistant lose its edge?

    None of this makes AI Assistant the right default for every team. The moment a repo stops being predominantly JVM, its advantage shrinks fast. In a full-stack repo with a Kotlin Spring backend and a React or TypeScript frontend, IntelliJ's semantic index only covers the backend half. The frontend experience in IntelliJ Ultimate is decent but not as fast or as well-tuned as what you get in VS Code with Copilot, or in Cursor, both of which are built frontend-first and iterate faster on JavaScript and TypeScript tooling.

    Latency and cost deserve a mention too, not as a footnote. AI Assistant needs its own subscription layered on top of an IntelliJ license, and agent-mode tasks that touch many files run noticeably slower than single-file Copilot suggestions, because they're running structural search, planning, and test execution rather than just generating text. If your day is mostly quick single-function completions, Copilot's lighter inline suggestions feel snappier, and for teams already standardized on VS Code, switching IDEs just to get AI Assistant's agent mode is rarely worth the disruption.

    Picking a setup for your team

    Run this quick gut check before committing to one tool.

    If your codebase is mostly Kotlin and Java, with Spring Boot or Kotlin Multiplatform as the center of gravity, and your team already lives in IntelliJ, pay for AI Assistant and push agent mode onto migrations and multi-file DI refactors. It saves real review time on exactly the mechanical work that eats a senior engineer's afternoon.

    If your team is polyglot, if frontend code makes up a large share of the repo, or if your workflow already centers on VS Code, don't force a switch to IntelliJ for the AI features alone. Run Copilot where your team already works, and treat AI Assistant as a specialist tool reserved for the JVM-heavy modules, not a universal replacement.

    Plenty of teams end up running both: Copilot or Cursor for day-to-day frontend and polyglot work, AI Assistant inside IntelliJ for the backend migrations where getting the dependency graph right actually matters. That split isn't a compromise, it's just matching each tool to the part of the codebase where its context model is strongest.

    Advertisement

    728 × 90 — Leaderboard — Google AdSense

    Related Articles