• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

temporalio / sdk-java / #359
68%
master: 75%

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 17 Aug 2026 10:23PM UTC
Jobs 1
Files 920
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

17 Aug 2026 10:04PM UTC coverage: 68.024% (-0.02%) from 68.042%
#359

push

github

web-flow
Report non-retryable PayloadValidationError as BAD_REQUEST (#3009)

## What changed

A data converter can now signal that a Nexus operation's input is invalid by throwing a non-retryable `ApplicationFailure` of type `PayloadValidationError` while deserializing the input. `PayloadSerializer` translates such a failure into a `BAD_REQUEST` `HandlerException` with the message `invalid operation input`, retaining the original failure as its cause.

Previously any `ApplicationFailure` from the data converter propagated and was turned into an `INTERNAL` handler error by `NexusTaskHandlerImpl`, which callers retry — so a caller sending invalid input was retried until timeout instead of failing fast.

## Unchanged

- `ApplicationFailure` of any other type → propagated as before (`INTERNAL`)
- A **retryable** `PayloadValidationError` → propagated as before (`INTERNAL`); non-retryable is required
- `HandlerException` from the converter → passed through untouched
- `InvalidProtocolBufferException` / `DataConverterException` → `BAD_REQUEST` as before
- `serialize()` is untouched — `BAD_REQUEST` would be wrong for a result-encoding failure

## Tests

- `PayloadSerializerTest`: positive case asserting `BAD_REQUEST`, non-retryable, the wrapper message and the preserved cause; negative cases for a different error type and for a retryable `PayloadValidationError`.
- `OperationInputDeserializationErrorPropagationTest`: end-to-end through the test server, including a retryable case that proves the non-retryable guard by being retried.

## Cross-SDK

Part of a coordinated change; equivalent PRs exist for Go, TypeScript, Python and .NET. The wrapper message wording is aligned across SDKs, adapted to each SDK's message style.

7405 of 12974 branches covered (57.08%)

Branch coverage included in aggregate %.

5 of 5 new or added lines in 1 file covered. (100.0%)

17 existing lines in 6 files now uncovered.

30510 of 42764 relevant lines covered (71.35%)

0.71 hits per line

Coverage Regressions

Lines Coverage ∆ File
6
56.1
-14.63% temporal-sdk/src/main/java/io/temporal/client/ActivityCompletionException.java
4
45.55
-3.14% temporal-sdk/src/main/java/io/temporal/internal/client/external/ManualActivityCompletionClientImpl.java
3
55.88
-4.41% temporal-sdk/src/main/java/io/temporal/client/ActivityCompletionClientImpl.java
2
66.67
-33.33% temporal-sdk/src/main/java/io/temporal/client/ActivityCanceledException.java
1
73.93
-0.95% temporal-sdk/src/main/java/io/temporal/internal/sync/WorkflowThreadImpl.java
1
81.41
0.11% temporal-test-server/src/main/java/io/temporal/internal/testservice/TestWorkflowMutableStateImpl.java
Jobs
ID Job ID Ran Files Coverage
1 #359.1 17 Aug 2026 10:23PM UTC 920
68.02
Source Files on build #359
  • Tree
  • List 920
  • Changed 11
  • Source Changed 1
  • Coverage Changed 11
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • af2f8537 on github
  • Prev Build on main
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc