JSF displaying entities with IDs: how to translate

2019-09-16 06:11发布

In a JSF page I have to display the data from an entity. This entity has some int fields which cannot be displayed directly but need to be translated into a descriptive string. Between them some can have a limited number of values, others have lots of possible values (such as a wordlwide Country_ID) and deserve a table on the Db with the association (ID, description).

This latter case can easily be solved navigating via relationship from the original entity to the entity corresponding to the dictionary table (ID, description) but I don't want to introduce new entities just to solve translations form ID to description.

Besides another integer field has special needs: the hundred thousand number should be changed with a letter according to a rule such as 100015 -> A00015, 301023 -> C01023.

Initially I put the translation code inside the entity itself but I know the great limits and drawbacks of this solution.

Then I created a singletone (EntityTranslator) with all the methods to translate the different fields. For cases where the field values are a lot I put them inside a table which is loaded from the singletone and transformed in a TreeMap, otherwise the descriptions are in arrays inside the class.

In the ManagedBean I wrote a getter for EntityTranslator and inside the jsf I use quite long el statements like the following:

#{myManagedBean.entityTranslator.translateCountryID(myManagedBean.selectedEntity.countryID)}

I think the problem is quite general and I'm looking for a standard way to solve it but, as already stated, I don't want to create new 'stupid' entities only to associate an ID to a description, I think it is overkill.

Another possibility is the use of converters Object(Integer) <-> String but I'm more comfortable in having all the translation needs for an Entity inside the same class.

标签: jsf entities
1条回答
Luminary・发光体
2楼-- · 2019-09-16 06:36

Your question boils down to the following simple line:

How can I display a field different from id of my entity in my view and how can I morph an integer field into something more meaningful.

The answer is that it depends on a situation.

If you solely want to input/output data, you don't need id at all apart from the possible view parameter like ?id=12345. In this case you can input/output anything you want in your view: the id is always there.

If you want to create a new entity most possibly you have a way of generating ids via JPA, or database, or elsehow besides the direct input from the user. In this situation you don't need to mess with ids as well.

If you want to use information on other entities like show user a dropdown box with e.g. a list of countries, you always have the option to separate label (let it be name) and value (let it be id), or even have a unique not null column containing the country name in your database table that will serve as a natural identifier. If you'd like to get data from the user using an input text field you always can create a converter that will do the job of transforming user input strings to actual entity objects.

Regarding the transformation of your integers, you've actually got several choices: the first one is to attach a converter for these fields that will roughly do 301023 -> C01023 and C01023 -> 301023 transformations, the second one is to write a custom EL function and the third one is to prepare the right model beforehand / do the transformations on-the-fly.

查看更多
登录 后发表回答