Release notes
The full history - every change with its reason, what was checked and the files involved - is
elasticore-history.md (in Korean), in the repository and in every project's blueprint/ folder.
Releases: GitHub releases ·
Maven Central.
Versions are {major}.{minor}.{YYMMDD}; a pre-release adds -alpha{n}, -beta{n} or -rc{n} and
sorts before the release of the same line.
3.0.261023 - next release (on main, not yet on Maven Central)
The pet store was built with team rules on rc1 and the rule guide's examples were checked one by one;
two places where what a rule wrote did not reach the running application are fixed. The runtime
libraries gain a Spring Boot auto-configuration, so ports no longer need @EnableElastiCore. The 2.x
generator and the jpa-springboot bundle produce the same output (only a return: decimal port,
which did not compile, changes).
Team rules
- The v3 search endpoint validates its body (
@Valid @RequestBody; v3, DDD, hexagonal, Kotlin): a constraint a rule puts on a search DTO (@Size(min = 2)) now answers 400 likecreate. Search DTOs generated today have no constraints, so nothing changes unless a rule, a hand edit or asortableInterface/pageableInterfacegetter adds one. A controller you already edited stays as it is. addMethodon a class without methods - an entity with fields only, an enum, an interface, a record - was dropped silently; it is now written before the closing brace. A file nothing is added to stays byte-identical.
Documentation
- Rule dev guide chapter 10, the rule API reference (
@Rule,EntitySpec,SourceCode,addMethod,excludeMethodand its endpoint names,ModelCheck,ArtifactContributor, ...), now in the guide copied into every project, not only on this site. The rule API's javadoc no longer calls it a prototype.
Guide index
blueprint/elasticore-guide-index.md- one line per guide section:<guide>:<first line>-<last line> <title> [terms], written from the copied guides, so a search for a term (@access) gives the range to read. A new file inblueprint/; the generated code does not change.
Ports without @EnableElastiCore
- Auto-configuration
io.elasticore.springboot.autoconfigure.ElastiCoreAutoConfigurationinelasticore-springboot3/-springboot4: it finds ports (@ExternalService,@DbmsService) in the@SpringBootApplicationclass's package and below and, only if there are any, registers them,DbTransactionGateway(oneEntityManagerFactoryor a@Primaryone),ApplicationContextProviderand the banner. An application without ports gets nothing. @EnableElastiCorestill works, each piece registered once; beans you already have win. Off withelasticore.autoconfigure.enabled=false;elasticore.banner.enabled=falsesilences the banner.- Ports outside the application class's package (including
scanBasePackages) are not found - use@AutoConfigurationPackage(basePackages = ...),@EnableElastiCorein that package, or a@Bean. With two or moreEntityManagerFactorybeans and none@Primary, mark one or declare aDbmsSqlExecutor. See Ports. - Ports that share a simple name are registered under their full class names, with a warning (they stopped the start before). Port proxies look up their beans in their own bean factory, which matters for tests with several contexts.
DBMS ports with one value
- A method returning one value (
long,string,boolean,decimal) returns the first column, converted; a NULL value or no row givesnull. Numbers failed withFailed to map tuple to DTOand aStringcame back empty. return: decimalandList<decimal>generatejava.math.BigDecimal(they generateddecimal, which did not compile).- A single value parameter (
long,string, a date, an enum) is bound to:nameby its name (needs-parameters, set by Spring Boot's Gradle and Maven plugins); a singlelongwas not bound. See DBMS ports.
3.0.261022-rc1 - release candidate
An agent was given the same requirement (a book, member and loan API) and later a pet store, built
with ElastiCORE, and every place it wrote Java by hand was looked at. This release closes those gaps
in the DSL. None of it changes the output of a project that does not use the new syntax, and the
2.x generator and the 2.x-compatible jpa-springboot bundle are unchanged (elcoreRulesCheck -Pstrict 150 MATCH / 0 DIFF / 2 ACCEPTED, elcoreTreeCheck 0 differ / 0 missing / 0 extra).
New in the DSL
@readonly/@noinputare values the server sets - on the v3 bundles the mapper no longer writes them from a DTO to the entity, the DTO drops@NotNull/@NotBlank, and@SchemasaysREAD_ONLY. Behaviour change: code that put such a value in a DTO and saved it must set it on the entity (beforeSave).@search(isnull)- a<field>Empty: Booleansearch property:trueempty,falseset (Java, Kotlin, TypeScript).@pattern('regex', 'message')- a@Patternthat compiles, the message after the value like@min, the same check in the TypeScript client; a single\dis a DSL warning.- A required reference (
post: Post!) requires the key field (postPostId) in save requests; the nested DTO is optional. Behaviour change for clients that sent only the nested object. @signinon the entity line generatesPOST /signin,POST /signout,GET /me,me()and the TypeScriptsignIn/signOut/me()- only when only the member and the administrator may change the row, and with one@signinentity per application; the login column is made unique.@default(now)documented with@readonlyas the time a row is made; ontimestampit writesInstant.now(), and atimestamp's default no longer goes into the DTO.
Error answers
- A lifecycle step from the wrong state answers 409 (was 422); a key that names no row answers
404 (was a foreign-key 409), checked before saving (
requireReferences; DDD and hexagonal bundles, references to another aggregate by id). ConflictExceptionand all hand-written refusals take a message code and are translated like generated ones:BadRequestException,NotFoundException,ConflictException,ForbiddenException,NotSignedInException,PortCallException.PortCallException- a failed call of another system answers 502 (code: upstream).RequestShapeErrors- what Spring MVC refuses before a controller (bad JSON, a wrong type, a missing parameter, 404, 405, 406, 415) answers problem+json with acodetoo.- The generated
findByIdanddeleteanswer a missing row with the same 404 body. - One language per answer:
Accept-Language, elsespring.web.locale, never the server machine's language; a translation in one domain is no longer hidden by another domain's English.
Generator and build
@search(like)ignores case in v3 mode (hexagonal, DDD,-Pv3, Kotlin);@search(%_%)keeps it.PUT /batchgoes throughupdate(dto)per row;@restExclude(update)takesbatchUpdatewith it and no longer breaks a hexagonal use case.@minsize(1)also answers 400 for a missing list; an optional embedded value no longer makes its required fields NOT NULL columns;@updatable(false)on a reference keeps it; a@readonlyowner keeps its owner.- A YAML file that does not parse (
LOAD ERROR) stopselcore3; a DSL warning is printed once. typescriptClient = truerunselcore3tswith the build;elcore3warns about a client older than the model, and the client follows the server's mode.- Ossie: expressions as
OSSIE_SQL_2026, subquery@formulaasANSI_SQL;count(Entity)counts the key column. @EnableElastiCorescans its own class's package, so@SpringBootTestgets port beans; a@Primarywrapper of a port proxy works again; a 2.x application's component scan no longer picks up the error handler.- Fixes from three rounds of review: sign-in through
@refor a cascaded DTO cannot write another entity's login or password, inherited reference checks, value objects from other domains,@rollupdiscriminators as in 2.x.
3.0.261020-alpha2
- A
Commententity or enum in a domain no longer breaks compilation (@Commentwritten fully qualified where names clash). - The README's quick start in the real order of work, a
build.gradlethat works as copied, Spring Initializr and Spring Boot 3 notes;ReadmeQuickStartTestgenerates the README's quick start. - 3.0 is supported for three years from its first stable release, from
release/3.0; Spring Boot 3 fixes are tested on 3.5.16. - CI also checks that the 2.x reference tree stays exactly as committed; the compatibility checks are described as they really compare.
3.0.261015-alpha1 - first public release
- The first release from the public repository:
elasticore-base,elasticore-springboot3,elasticore-springboot4and the Gradle pluginio.elasticoreon Maven Central. - 2.x defects fixed where the output differs:
@length(min=)withstring(n),@formula(no column, not mapped from DTOs,=in expressions), both@ManyToOnerelations to one target in search DTOs,@forceupdatemapping, values in generated service tests. - Domains and model files read in the same order on every operating system.
- Security in the runtime:
ignoreSSLon a multipart call no longer turns certificate checks off for the whole JVM; credentials masked in logs;IdUtils.newIdusesSecureRandom. - The runtime POMs follow Spring Boot's dependency management instead of pinned old versions.
Upgrading from 2.2: change the version.