| At line 1 added 34 lines |
| [EntityBeanLocator](EBL) is a standard framework interface in RSF, that comes with a default implementation which makes writing an [OTP] space for an entity very easy, given just a standard "DAO-type" API managing the entity. This is a conventional application-scope API with methods such as "findById", "save", "delete", etc. and the EBL does the work of automatically setting up an [EL] address space for all the managed entities, and managing a request-scope cache so they can be addressed and manipulated quickly and clearly. |
|
| !!Using the framework default implementation |
|
| Assuming the API for the entity is sufficiently "reasonable", this doesn't require writing any code, but simply a Spring definition. This definition is for an application scope bean extending the RSF framework parent {{entityBeanLocatorParent}}. |
|
| Here is the set of properties supported on this bean and their meaning: |
|
| |Property|Description |
| |{{fetchMethod}}|(Required) An EL path to a "fetch method" which can fetch entities by their ID - for example, a DAO API bean named {{BlogDao}} which had a method called {{findById}} which took a single argument, the Id, would be registered with a {{fetchMethod}} of {{BlogDao.findById}} |
| |{{newMethod}}|An EL path to a method which will be used to instantiate "new" (not yet persistent) examples of the entity. Either this property or {{entityClass}} must be set. |
| |{{entityClass}}|A Class object representing the class of the entity that this EBL deals in. If {{newMethod}} is not set, the EBL will instantiate new instances of the entity using the default constructor of this class. |
| |{{saveMethod}}|An EL path to a "save method" which will save modified entities back to some kind of persistence. This must take a single argument, which is the modified entity to be saved. If this property is not set, the {{saveAll}} method of the EBL will not function. |
| |{{removeMethod}}|An El path to a "remove method" which will remove an entity from persistence. This method must take one argument, which is the id of the entity to be removed. |
|
| !!A minimal example |
| For example, an (minimal)entry for a "Blog" entity might look like this: |
|
| {{{ |
| <bean id="Blog" parent="entityBeanLocatorParent"> |
| <property name="entityClass" value="myPackage.Blog"/> |
| <property name="fetchMethod" value="myBlogDao.findById"/> |
| <property name="saveMethod" value="myBlogDao.save"/> |
| </bean> |
| }}} |
| !!What you get for your money |
|
| After having set up a definition of the sort just described, what you get done for you is the following: |
|
| * The full [OTP] pattern supported for your entity - that is, the ability to address in any request scope paths of the form {{Blog.15}} (representing the Blog entity with id 15) or even {{Blog.new 1}} representing a particular, transient Blog entity good for the current request |
| * If you supplied a {{saveMethod}}, you will get the ability to invoke a {{saveAll}} method on the resulting bean. Simply fetch the bean of the name you registered (only at ''request scope''), which will be an implementor of {{EntityBeanLocator}}, and invoke {{saveAll}} on it at request end. |
| * If you supplied a {{removeMethod}}, you will get the ability to invoke {{remove}} on the resulting bean, with an id argument - as well as the ability to target [deletion bindings|bindings] at the OTP root over the request. |
| * Finally, you will get for free to participate in the [EntityNameInferrer] scheme. This is particularly useful when making selection controls which are meant to select which instance of one entity type is attached to another via the [IDDefunnellingReshaper]. |
|