Repository navigation
Conversation
The two records added in openMF#4 (operations-app and identity-account-mapper) bind configuration without checking it. A missing key binds to null and the processor starts; the URL it builds then ends in "null", and the problem shows up only at the first call. The baseline read these twelve keys through nineteen bare @value declarations with no default, so a missing key stopped startup. Both records are now @validated, every component is @NotNull, and the operations-app endpoints group is @Valid, so the check also reaches the keys inside it. A missing key stops startup again, and the error names the property. Every field is a String, so an empty value is still accepted, as before. spring-boot-starter-validation is added because nothing on the classpath provided Bean Validation; without it @validated is ignored. The version comes from the BOM. ConfigurationPropertiesTest now also sets operations-app.username and password in its shared configuration, because they are required. ShippedConfigBindsTest binds the two records from the real application.yaml, including the identity_account_mapper keys spelled with underscores. It checks that each record on its own refuses to start when nothing is configured, that a key missing inside the endpoints group stops startup, and that an empty String is accepted. The other @value in this processor are not touched here.
tdaly61
approved these changes
Oct 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #4. The two configuration records that #4 added bind the configuration but do not check it, so a missing key no longer stops startup. This PR makes every key in them required again, as it was before #4, and adds the binding test the rest of the PHEE-417 series has.
What was wrong
#4 was merged before the series went back to
@Validated+@NotNull, so its records (OperationsAppPropertiesandIdentityAccountMapperProperties) have neither. So today, ondev, a missing key binds tonulland the processor starts. The URL it builds then ends innull, and the problem shows up only at the first call.Before #4, these twelve keys were read through nineteen bare
@Valuedeclarations, none of them with a default, so a missing key stopped startup.What changes
@Validated. Every component is@NotNull, and theoperations-appendpointsgroup is@Valid, so the check also reaches the keys inside it.spring-boot-starter-validationis added, with the version from the BOM. Nothing on the classpath provided Bean Validation, and without it@Validateddoes nothing.ConfigurationPropertiesTestnow also setsoperations-app.usernameandpasswordin its shared configuration, because they are required.ShippedConfigBindsTest, the same kind of test as in the channel, ams-mifosx, mm-gsma, mojaloop and connector-bulk PRs.No code that reads the records changes, and no property name changes. The other
@Valuein this processor are not touched here.Result
String, so an empty value is still accepted, as before.How it was checked
Build.
./gradlew clean buildwith JDK 21.0.10: green, including spotless and checkstyle. 9 tests: 4 new inShippedConfigBindsTest, 3 inConfigurationPropertiesTest, plus one each inBulkProcessorApplicationTestsandCucumberContext.The new test.
ShippedConfigBindsTestbinds the two records from the realapplication.yamland checks the URLs they build. That includes theidentity_account_mapperkeys, which the file spells with underscores. It checks that each record, on its own and with nothing configured, refuses to start and names its prefix. It checks that a key missing inside theendpointsgroup stops startup, and that an emptyStringis accepted. To check that the tests can fail, they were run against two broken copies of the code. Without@ValidatedonIdentityAccountMapperProperties,everyRecordRefusesToStartWhenItsSectionIsMissingfails. Without@Validon theendpointsgroup,aMissingKeyInsideAGroupStopsStartupfails.What the deployment passes (gazelle3). The
ph-ee-bulk-processorDeployment, from its CR, sets 34 variables and mounts theph-ee-configconfigmap with profilebb. Two of them are empty,IDENTITY_MAPPER_CONTACTPOINTandCONFIG_ORDERING_FIELD. Both are strings, and neither is read by these records. Of the keys these records read, the Deployment setsOPERATIONS_APP_CONTACTPOINTandOPERATIONS_APP_ENDPOINTS_BATCH_TRANSACTION, and the rest comes fromapplication.yaml.Temporary pods on gazelle3. Each pod used the Deployment's own image (
eclipse-temurin:21), environment and configmap, copied as they are, with the jar mounted. There was one change:ZEEBE_BROKER_CONTACTPOINTpointed at an address that does not answer, so a test pod could not take a real job. These records have no number or boolean field, so the negative check removes a key instead of emptying one. Both jars were started with a copy of the shippedapplication.yamlwithoutoperations-app.endpoints.auth, a key the Deployment does not set. The real Deployment was not touched, and every pod was deleted afterwards.Routes startup (started:59), no error, no job takendevRoutes startup (started:59)operations-app.endpoints.authProperty: operations-app.endpoints.auth,Reason: must not be null, exit 1devoperations-app.endpoints.authTicket: PHEE-417.