An easy, extensible

Start quickly

It shouldn't be a slow and painful process


Getting initial code

it's only a few clicks away on the initializr


Starting the app for the first time

just run the main Java class

Adding out-of-the-box functionalities

just add the desired maven dependencies



Evolve your app'

Don't reinvent the wheel

Use powerful out-of-the-box tooling and extension capabilities

lots of features are already handled, you just have to configure it


Override and append your own business logic and code

mind (only) your own business !

Write your front-end the way you like it

single-page application, api only, server-generated pages, static pages, mobile app, none, ...


Customize your back-office

Scss builder to show your colors !

Deliver quickly

It remains a Spring-Boot app' !

Use any additional Spring-Boot starter

there are lots of options to pick !


Package your application once, run it everywhere

on your laptop, on premises, on the cloud, ...

Migrate and evolve your database easily

using Liquibase and versionned changesets



Our goal is to create a common and usable tool


Document, report bugs and help us correct them

the project is on github, open-source and help is most welcome !

Easy public or private auto-configured modules creation

share as you see fit, keep at your discretion



Spring 5

Easy, clean and modern Java app's


IoC, AoP, powerful abstractions

clean code, loose coupling of components, testability

Fast and powerful container

easy basic usage, sometimes hard to master, but powerful when needed

Massive ecosystem and third-parties integration

dozens of sub-projects including spring-data, spring-batch, spring-security, spring-ldap, spring-* ......

Spring-Boot 2

Compose your application components !


Auto-configure everything for you, depending on what's on your classpath

@ConditionalOnMissingBean, @ConditionalOnBean, @ConditionalOnClass, @Conditional, @AutoconfigureAfter, @AutoconfigureBefore, ...

Custom auto-configuration can be added

it's the building block of blossom modules

Health, metrics and application monitoring with Actuator

can be queried via JMX, API and blossom interface


You are in a safe place.


Leading security tool widely used

Web Filters, , stateless or stateful, many existing providers supported, many protocols (OAuth2)

Powerful authorization features

privileges, pre and post authorization on any spring bean, custom voters


JPA / Hibernate

Model and access your data


Standard ORM solution and most popular implementation for relational database

lots of features, but sometimes hard to master for beginners

Database generation has been deactivated by default

we prefer modeling the database schema and run code on top


spring-data-jpa and querydsl add extra-capabilities

use repositories easily and create complex typesafe queries


Search and filter anything


Embedded faceted search engine for all your entities

combined with generic implementations of indexation/search engines

Sadly we are stuck in an old version (2.4.6) as of now

we shall provide a Docker/Kubernetes integration in the future


Can be used in standalone mode

it only needs an application configuration change


Source control for your database.


Handles the database schema creation and following updates

through versionned and named/dated changesets executed at startup

Database vendor aware and context-dependant logic

can manage specific datatypes and edge cases


Supports multiple formats



High performance cache implementation


Near optimal cache built for java 8

more recent that some of its concurrents

Supported by the Spring cache Abstraction

could be replaced transparently in the future


Only local and in-memory

it's the sad part :-(

Quartz Scheduler

Tick, tock, goes the clock.


Feature-rich and configurable job scheduling library

recently supported out-of-the-box by Spring-Boot via a starter

Database or in-memory job and triggers store

could be replaced transparently in the future


Use standard Java components (Task, Job, Trigger, Listeners ...)

may execute any Java code you program them to do



Freemarker / Jquery

A bit old-school, but still roaring.


Simple markup, powerful results

freemarker syntax is very easy to learn yet it's everything you need to build a server generated page

Macro and directives allow easy pages and components creation

<#if sufficient><#doNothing/></#if>


Less susceptible to be impacted by the Javascript-world framework frenzy

tell us, should we use Angular, React or Vue instead ?

SPA interfaces using your favorite framework could be added using the Rest API



Core functionalities

No generated code


No classpath scanning for components


Relies on Spring-Boot auto-configuration


Register core functionnalities only

user / role / group management + scheduler + search engine


Configurable default admin user system/system


Privilege plugin system with namespace/feature/right levels

A CurrentUser object is used in the security context

@PreAuthorized are used in Java beans

A <@privilege.has "privilege"> macro is provided for ftl template



Web is secured with a spring-security login flow and session management

REST API is secured with OAuth2

Front-end is not secured by default


An UI web interface provides insight about failed attempts


REST Api and Web interfaces are provided.

Both use Spring-MVC (no webflow as of now)


ControllerAdvices provide common functionalities

filtered menu by privilege, exception handling, current user, current and available locales


Controllers and MenuItems are added only if features are present and actives


@BlossomController and @BlossomApiController

simplifies the creation of pages mapped on /blossom and /blossom/api


Blossom does not override the Spring-Boot defaults

Starts an in-memory h2database, use configuration properties to override the behavior


Blossom  tracks and execute every Liquibase changeset on the classpath at startup

taking care of every additional module used, and the order it should be executed (by name)


Blossom validates the JPA  entities to the database

giving insight of your code / DB synchronisation state


Blossom relies on the Spring Cache Abstraction

provides a custom cache resolver, cache manager and cache implementation using Caffeine


Blossom provides a way to configure each Caffeine cache separately

with a @Bean and a provided builder


Blossom adds a few capabilities to the caffeine cache :

  • disable a specific cache at runtime
  • clearing it fully
  • clearing all caches
  • display size, hits and misses statistics


An Elasticsearch node is started embedded by default

but you can configure it with application properties


Blossom provides default implementations of SearchEngine and IndexationEngine

to be easily used for blossom-managed entities


Blossom provides a way to add configurable facets to your searches


An omnisearch feature in both ui Web and API allows to run a search across

all availables and enabled SearchEngines

Task scheduling

Blossom relies on spring-boot-starter-quartz

but you can configure it with application properties


Blossom provides a global listener to save traces of trigger executions across restart

to be easily used for blossom-managed entities


Register your custom jobs and triggers using Spring @Beans


Blossom Ui Web provides an interfaces that allows you to start manually a job


Blossom use the Spring-Boot MessageSource as @Primary

which mean you can use a in your classpath, or define multiple files


It adds a parent MessageSource which does an initial classpath scanning to find all messages files

add files to classpath:/messages/ for them to be picked up automatically


Locales choices can be enabled/disabled with a property, english is default


The UI (web) provides a selector to change the current Locale amongst the available ones


Generic implementations

Generic implementations and abstract objects are provided to help reduce boilerplate code :

JPA entities (AbstractEntity + AbstractAssociationEntity)

Spring-data Repositories  (CrudRepository)

DAOs (GenericReadOnlyDao, GenericCrudDao, GenericAssociationDaoImpl)

DTOs (AbstractDTO, AbstractAssociationDTO)

DTOMappers (AbstractDTOMapper)

Services (GenericReadOnlyServiceImpl, GenericCrudServiceImpl, GenericAssociationServiceImpl)


Thoses implementations bring with them

Automatic caching at the DAO layer

Generic event at the Service layer

Exception handling

A @ControllerAdvice handles Exception happening in a @BlossomController

Throwable, HttpRequestMethodNotSupportedException, NoHandlerFoundException, NoSuchElementException, AccessDeniedException


A custom ErrorViewResolver find specific error views depending

on the user being on the back-end or front-end

freemarker templates are located in
src/main/resources/templates/blossom/error/ or src/main/resources/templates/blossom/blossm/error/


Blossom relies on the spring-boot-mail-starter to create a JavaMailSender

using spring.mail.* prefixed properties


Blossom provides a MailSender interface and two implementations

a NoopMailSenderImpl that only logs (if no JavaMailSender is found)

a MailSenderImpl that really sends mails based on Freemarker templates, and offers recipient filtering with regexp


You can use that generic MailSender and use it directly or in business-related mail senders

e.g. UserMailService for account creation and password change mail notifications


Generic Events are published in the ApplicationContext by the generic Service layer

AfterDissociatedEvent, AssociatedEvent, BeforeDeletedEvent, BeforeDissociatedEvent, CreatedEvent, DeletedEvent, UpdatedEvent


You can add your own business related events easily

Extending the above ones or adding your own


They can be processed by custom @EventListener or @TransactionalEventListener

at your convenience



Blossom uses Actuator

only info, endpoints and tracesstats are active by default


A specific HttpTraceRepository is used to index front-end requests to Elasticsearch

default TTL for documents is 7 days, allowing to create the right-side of the dashboard interface with aggregations


A public /status endpoint using the HealthIndicator is available for basic external monitoring



Blossom uses SCSS and compile the theme at startup

via a CommandLineRunner


Blossom provides a ThemeBuilder to set available SCSS variables  and add new themes

the default green theme can be disabled when another one is provided


Current theme variables (colors, ...) are accessibles in the ftl, so they can be used

in any pages and javascript libraries



Live demo