Annotation Type ObjectFactory
-
@Retention(CLASS) @Target(METHOD) public @interface ObjectFactory
This annotation marks a method as a factory method to create beans.By default beans are created during the mapping process with the default constructor. If a factory method with a return type that is assignable to the required object type is present, then the factory method is used instead.
Factory methods can be defined without parameters, with an
@
TargetType
parameter, a@
Context
parameter, or with the mapping source parameter. If any of those parameters are defined, then the mapping method that is supposed to use the factory method needs to be declared with an assignable result type, assignable context parameter, and/or assignable source types.Note: the usage of this annotation is optional when used in the
Mapper.uses()
if no source parameters are part of the signature, i.e. it is declared without parameters or only with@
TargetType
and/or@
Context
. It is however mandatory when used inside an@
Context
annotated class.Example: Using a factory method for entities to check whether the entity already exists in the EntityManager and then returns the managed instance:
@ApplicationScoped // CDI component model public class ReferenceMapper { @PersistenceContext private EntityManager em; @ObjectFactory public <T extends AbstractEntity> T resolve(AbstractDto sourceDto, @TargetType Class<T> type) { T entity = em.find( type, sourceDto.getId() ); return entity != null ? entity : type.newInstance(); } }
If there are two factory methods, both serving the same type, one with no parameters and one taking sources as input, then the one with the source parameters is favored. If there are multiple such factories, an ambiguity error is shown.
- Since:
- 1.2
- Author:
- Remo Meier