Chenile 2.1.31 release notes

← All release notes

Work in progress
2.1.31 is in development and not yet published to Maven Central. The notes below describe what's landing in this release; check the GitHub releases for what has actually shipped.

Highlights

Transport-neutral Chenile services

@ChenileController is now supplied by chenile-core, while retaining its existing package name for source compatibility. A plain Spring bean can become a Chenile controller without @RestController, a servlet request, an HTTP route, or a chenile-http dependency. Headless controllers use @ChenileOperation and @ChenileBody and can serve in-process, event-driven, and serverless workloads.

The common annotation-initialization lifecycle now lives in core. The HTTP initializer inherits it and adds only Spring MVC controller selection and mapping behavior.

Annotation-based Chenile services

Simplified Spring MVC mappings

One SpringMvcMappingProducer now handles all five existing composed Spring mapping annotations and direct @RequestMapping declarations. A Chenile operation must have one supported HTTP verb and one route; invalid ambiguous mappings are rejected during startup instead of being silently reduced.

Service-registry publication controls

@ChenileController(registerInServiceRegistry = false) suppresses publication for one service while retaining it in local Chenile configuration. For a whole package that should consume metadata but publish nothing, configure:

chenile.service.registry.read-only=true

Read-only mode retains registry reads and local cache loading. It prevents both automatic startup publication and direct delegate save(...) calls before an outbound HTTP write occurs.

JGen headless-service blueprint

The new chenile-headless-service blueprint generates a non-HTTP Chenile service and prompts for registry publication. It requires Chenile 2.1.31 or newer. More generally, blueprints can declare sinceVersion; JGen validates it through its OWIZ processor chain before hooks or generated files run.

Diagnostics and BDD helpers

CANNOT_INVOKE_TARGET diagnostics now retain the target operation, exception type, and underlying message. REST Cucumber utilities add collection assertions for scalar values and arbitrary item key/value pairs.

Upgrade notes

Once published, point your application’s parent (or chenile.*.version properties) at 2.1.31 and rebuild — the 11 repositories move together under chenile-parent.

<parent>
  <groupId>org.chenile</groupId>
  <artifactId>chenile-parent</artifactId>
  <version>2.1.31</version>
</parent>

Existing HTTP controllers continue to work. New headless controllers should use @ChenileOperation for every operation and @ChenileBody for an exchange-body parameter. Direct @RequestMapping methods must have one supported HTTP verb and one route.