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.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.