Building entity views
How entity views work
An EntityView
is created by an EntityViewFactory
based on an EntityViewRequest
.
A controller is still responsible for executing (usually rendering) the actual EntityView
.
The GenericEntityViewController
is responsible for loading and rendering all default views in the AdminWebModule UI.
The path of the web request to GenericEntityViewController
will determine:
-
the name of the view that should be rendered
-
which
EntityViewRegistry
will be used for loading the view (EntityConfiguration
orEntityAssociation
)
You can force the view being rendered by simply providing the view name as a request parameter with key view. |
The controller creates an EntityViewRequest
, retrieves the EntityViewFactory
and builds the corresponding EntityViewContext
and EntityViewCommand
.
EntityViewRequest
Wraps together all the information of a specific entity view request:
-
the web request that is creating the view
-
the contextual information of the entity being viewed (represented by the
EntityViewContext
) -
the command that should be executed on the
EntityViewFactory
(represented by theEntityViewCommand
) -
the name of the view being requested and the
EntityViewFactory
being used -
the
PageContentStructure
of the page being rendered (if applicable)
Please refer to the EntityViewRequest
javadoc for a description of all available properties.
EntityViewContext
The EntityViewContext
contains contextual information and provides access to components that should be used for building a view.
Contextual information is for example the entity type, specific entity or entity association being viewed.
Components are things like the EntityLinkBuilder
, EntityMessages
or AllowableActions
Please refer to the EntityViewContext
javadoc for a description of all available properties.
EntityViewContext is available as a request-scoped bean but only in case of a request passing through the GenericEntityViewController will the data be loaded.
Loading the EntityViewContext attributes manually can be done by using the EntityViewContextLoader bean.
You should use the ConfigurableEntityViewContext interface to modify a view context.
|
EntityViewCommand
The EntityViewCommand
represents the command that should be executed on the EntityViewFactory
to create the corresponding EntityView
.
Most often the command represents the form of a view where the request parameters are bound to.
An EntityViewCommand
has 2 attributes: the (optional) entity DTO being bound and a map of named extensions.
Customizing view processing can be done by registering additional extensions that will be rendered and validated upon binding.
The EntityViewCommand
will be validated for every state modifying request: web requests using POST, PUT, PATCH or DELETE.
Please refer to the EntityViewCommand
javadoc for a description of all available properties.
EntityViewFactory
Every view is built by an EntityViewFactory
.
An EntityViewRegistry
(like EntityConfiguration
or EntiyAssociation
) is nothing but a map of EntityViewFactory
by view name.
An EntityViewFactory
is a stateless controller with 4 controller methods that are expected to be called in a specific order.
Please refer to the javadoc for an overview of the different controller methods and their purpose.
DispatchingEntityViewFactory and EntityViewProcessor
EntityModule has only a single implementation of EntityViewFactory
in the form of the DefaultEntityViewFactory
.
The DefaultEntityViewFactory
:
-
supports
ViewElement
based rendering model - heavily used by EntityModule for building the HTML markup -
dispatches its controller methods in a more fine-grained manner to a list of registered and ordered
EntityViewProcessor
instances.
The default builders when configuring views only register EntityViewProcessor
beans on the factory.
When an EntityViewFactory
controller method is being called, it will be translated into one or more processor methods and those method calls will be dispatched to all processors in order.
Several adapter EntityViewProcessor
classes are available:
-
use
EntityViewProcessorAdapter
for most use cases, it provides several adapter methods that also allow you to hook into theViewElement
generation lifecycle -
use
SimpleEntityViewProcessorAdapter
if you do not need to hook into theViewElement
generation lifecycle -
use
ExtensionViewProcessorAdapter
if you want to create a custom view/form that represents a so-called extension object-
the view is part of the entity configuration but often does not manage properties of the actual entity type
-
The DefaultEntityViewFactory will not execute any of the rendering related methods if any of the previous methods has marked the EntityView as being a redirect.
|
Please refer to the EntityViewProcessor, EntityViewProcessorAdapter and SimpleEntityViewProcessorAdapter for more details on the available processor methods. The appendix also provides a list of all available general purpose processors.
Transaction support
The DefaultEntityViewFactory
uses a TransactionalEntityViewProcessorRegistry
and enables transactions on all state modifying HTTP methods: POST, PUT, PATCH or DELETE.
If a transaction manager bean name is available on the EntityConfiguration
, transactions will be enabled by default for all form views: create, update, delete and custom form views.
This means that all calls in state modifying doControl()
methods of all EntityViewProcessor
instances will happen in a single transaction.
The transaction manager bean name is registered as an attribute EntityAttributes.TRANSACTION_MANAGER_NAME
and is detected automatically for every Spring Data repository based entity.
You can enable transactions manually on the EntityViewFactoryBuilder
by specifying either the PlatformTransactionManager
to use, the name of the transaction manager bean or a TransactionTemplate
if you need more fine-grained control.
Model attributes
The GenericEntityViewController
exposes the following model attributes to the Spring MVC view:
Attribute name | Value |
---|---|
entityViewRequest |
|
entityViewCommand |
|
entityViewContext |
|
Default view types
EntityModule supports 3 view types by default.
When defining a new view (see the next section) it will be one of these types.
The view type determines the base template that will be used to setup the EntityViewFactory
.
The following view types are defined:
View type | Template name | Description |
---|---|---|
list view |
listView
( |
Base configuration for rendering a list of entities. |
form view |
updateView
( |
Base configuration for rendering a form for a single entity. |
generic view |
genericView
( |
Barebone configuration for visualizing a single entity. |
The template name can be used to replace the initializer for the EntityViewFactoryBuilder
.
See the chapter on the EntityViewFactoryBuilderInitializer.
See also the next chapters for more information on list view, form view and generic view.