|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: 'A2A Java SDK 1.1.0.Final Released' |
| 4 | +date: 2026-06-29 |
| 5 | +tags: ai a2a |
| 6 | +synopsis: 'A2A Java SDK 1.1.0.Final is now available -- adding per-user task authorization and a new project website.' |
| 7 | +author: ehsavoie |
| 8 | +--- |
| 9 | + |
| 10 | + |
| 11 | + |
| 12 | +I am pleased to announce the release of [A2A Java SDK 1.1.0.Final](https://github.com/a2aproject/a2a-java/releases/tag/v1.1.0.Final). This is the first feature release after our [1.0.0.Final GA](https://a2aproject.github.io/a2a-java/announces/2026/06/10/a2a-java-sdk-1-0-0-final-released/), bringing per-user task authorization and several stability fixes. |
| 13 | + |
| 14 | +## What's New |
| 15 | + |
| 16 | +### Task Authorization SPI |
| 17 | + |
| 18 | +The headline feature of 1.1.0 is the new `TaskAuthorizationProvider` SPI, which enables **per-user task authorization** for multi-tenant deployments. This is a breaking change for implementations that rely on unguarded task access. |
| 19 | + |
| 20 | +By implementing this SPI as a CDI bean, you can control which users can read, write, or create tasks: |
| 21 | + |
| 22 | +```java |
| 23 | +@ApplicationScoped |
| 24 | +public class MyTaskAuthorizationProvider implements TaskAuthorizationProvider { |
| 25 | + |
| 26 | + @Override |
| 27 | + public boolean checkRead(ServerCallContext context, String taskId, TaskOperation op) { |
| 28 | + return isOwner(context.getUser(), taskId); |
| 29 | + } |
| 30 | + |
| 31 | + @Override |
| 32 | + public boolean checkWrite(ServerCallContext context, String taskId, TaskOperation op) { |
| 33 | + return isOwner(context.getUser(), taskId); |
| 34 | + } |
| 35 | + |
| 36 | + @Override |
| 37 | + public boolean checkCreate(ServerCallContext context, TaskOperation op) { |
| 38 | + return context.getUser().isAuthenticated(); |
| 39 | + } |
| 40 | + |
| 41 | + @Override |
| 42 | + public boolean isTaskRecorded(String taskId) { |
| 43 | + return ownershipStore.contains(taskId); |
| 44 | + } |
| 45 | + |
| 46 | + @Override |
| 47 | + public void recordOwnership(ServerCallContext context, String taskId, TaskOperation op) { |
| 48 | + ownershipStore.putIfAbsent(taskId, context.getUser().getUsername()); |
| 49 | + } |
| 50 | +} |
| 51 | +``` |
| 52 | + |
| 53 | +Key design decisions: |
| 54 | + |
| 55 | +* **Fail-open by default** -- when no `TaskAuthorizationProvider` is present, all operations are permitted, preserving backward compatibility. |
| 56 | +* **Information hiding** -- unauthorized access returns `TaskNotFoundError`, making it indistinguishable from a genuinely missing task. Callers cannot probe for the existence of tasks they don't own. |
| 57 | +* **Integrated with TaskStore** -- both `InMemoryTaskStore` and `JpaDatabaseTaskStore` support authorization-aware filtering in `listTasks`, so users only see their own tasks. |
| 58 | +* **Thread-safe and idempotent** -- the `recordOwnership` contract requires idempotent implementations (e.g., `putIfAbsent`) to handle concurrent task creation safely. |
| 59 | + |
| 60 | +### Project Website |
| 61 | + |
| 62 | +The A2A Java SDK now has its own [project website](https://a2aproject.github.io/a2a-java/), built with [Roq](https://pages.quarkiverse.io/quarkus-roq/) -- a Quarkus-based static site generator. The site includes getting-started guides for the server and client SDKs, community resources, and release announcements. |
| 63 | + |
| 64 | +### Bug Fixes |
| 65 | + |
| 66 | +* **Disabled HTML escaping in protobuf JSON serialization** across REST and JSON-RPC transports -- special characters in agent responses are now preserved correctly ([#947](https://github.com/a2aproject/a2a-java/pull/947)) |
| 67 | +* **Fixed CDI request context handling** in deferred destruction, preventing errors when the request context was already active ([#950](https://github.com/a2aproject/a2a-java/pull/950)) |
| 68 | +* **Suppressed `CancellationException`** in JDK HTTP client SSE streaming -- client-side stream cancellations no longer produce noisy stack traces ([#951](https://github.com/a2aproject/a2a-java/pull/951)) |
| 69 | +* **Added no-args constructors** to response/request classes for Gson compatibility ([#937](https://github.com/a2aproject/a2a-java/pull/937)) |
| 70 | +* **Improved correctness** and removed dead code across modules ([#954](https://github.com/a2aproject/a2a-java/pull/954)) |
| 71 | + |
| 72 | +## Migration from 1.0.0.Final |
| 73 | + |
| 74 | +The `TaskAuthorizationProvider` feature introduces a breaking change to the `TaskStore` interface. If you have **custom `TaskStore` implementations**, you will need to update them to accommodate the new authorization-aware methods. |
| 75 | + |
| 76 | +* If you **don't implement** `TaskAuthorizationProvider`, behavior is unchanged -- all operations are permitted. However, your custom `TaskStore` must still satisfy the updated interface. |
| 77 | +* If you **do implement** `TaskAuthorizationProvider`, you'll need to handle ownership recording for pre-existing tasks. We recommend a migration step to backfill ownership data before enabling authorization checks. |
| 78 | + |
| 79 | +Update your BOM version to pick up the new release: |
| 80 | + |
| 81 | +```xml |
| 82 | +<dependencyManagement> |
| 83 | + <dependencies> |
| 84 | + <dependency> |
| 85 | + <groupId>org.a2aproject.sdk</groupId> |
| 86 | + <artifactId>a2a-java-sdk-bom</artifactId> |
| 87 | + <version>1.1.0.Final</version> |
| 88 | + <type>pom</type> |
| 89 | + <scope>import</scope> |
| 90 | + </dependency> |
| 91 | + </dependencies> |
| 92 | +</dependencyManagement> |
| 93 | +``` |
| 94 | + |
| 95 | +## Contributors |
| 96 | + |
| 97 | +Thank you to the contributors of this release! |
| 98 | + |
| 99 | +[@ehsavoie](https://github.com/ehsavoie), [@kabir](https://github.com/kabir) |
| 100 | + |
| 101 | +## Resources |
| 102 | + |
| 103 | +* [Release Notes on GitHub](https://github.com/a2aproject/a2a-java/releases/tag/v1.1.0.Final) |
| 104 | +* [Maven Central](https://central.sonatype.com/artifact/org.a2aproject.sdk/a2a-java-sdk-parent/1.1.0.Final) |
| 105 | +* [JavaDoc](https://javadoc.io/doc/org.a2aproject.sdk/) |
| 106 | +* [A2A Specification](https://a2a-protocol.org/v1.0.0/specification/) |
| 107 | +* [Project Website](https://a2aproject.github.io/a2a-java/) |
| 108 | +* [Examples](https://github.com/a2aproject/a2a-java/tree/main/examples) |
| 109 | + |
| 110 | +## Come Join Us |
| 111 | + |
| 112 | +We value your feedback a lot so please report bugs, ask for improvements etc. Let's build something great together! |
| 113 | + |
| 114 | +If you are an A2A Java SDK user or just curious, don't be shy and join our welcoming community: |
| 115 | + |
| 116 | +* provide feedback on [GitHub](https://github.com/a2aproject/a2a-java/issues); |
| 117 | +* craft some code and [push a PR](https://github.com/a2aproject/a2a-java/pulls); |
| 118 | +* discuss with us in the `#a2a-java` channel on [Discord](https://discord.gg/jTtSkJB74Q); |
0 commit comments