Я работаю над проектом Java EE6 с использованием JPA / EJB / JSF, и у меня возникли некоторые проблемы при разработке поддержки нескольких языков для сущностей.Существует три соответствующих объекта:
Язык (имеет идентификатор)
Компетенция (имеет идентификатор)
Имя Competence (имеет ссылку на Компетентность, Ссылка на язык и строку)
Компетенция имеет единицу-to-many ссылка на CompetenceName, реализованная с помощью Map, содержащей один объект для каждого языка, для которого существует имя для Competence.Обратите внимание, что компетенции создаются динамически , и поэтому их имена не могут существовать в пакете ресурсов.
При перечислении компетенций на веб-странице я хочу, чтобы они отображались на языке текущеговошедший в систему пользователь, он хранится в управляемом компоненте Session Scoped.
Есть ли какой-нибудь хороший способ сделать это, не нарушая хороший дизайн MVC?Моя первая идея состояла в том, чтобы получить сессионный бин области действия непосредственно из метода «getName» в сущности Competence через FacesContext и посмотреть на карту CompetenceNames следующим образом:
public class Competence
{
...
@MapKey(name="language")
@OneToMany(mappedBy="competence", cascade=CascadeType.ALL, orphanRemoval=true)
private Map<Language, CompetenceName> competenceNames;
public String getName(String controller){
FacesContext context = FacesContext.getCurrentInstance();
ELResolver resolver = context.getApplication().getELResolver();
SessionController sc = (SessionController)resolver.getValue(context.getELContext(), null, "sessionController");
Language language = sc.getLoggedInUser().getLanguage();
if(competenceNames.get(language) != null)
return competenceNames.get(language).getName();
else
return "resource missing";
}
Это решение кажется чрезвычайно грубымпоскольку объект опирается на уровень контроллера и должен извлекать контроллер сеанса каждый раз, когда мне нужно его имя.Более совместимым с MVC решением было бы использование параметра Language, но это означает, что каждый отдельный вызов из JSF должен включать язык, извлекаемый из управляемого bean-объекта сессионной области, который тоже не является хорошим решением.
Есть ли у кого-нибудь мысли или шаблоны проектирования по этому вопросу?