stackoverflow.com/questions/156586/...
отаю над проектом Java EE6 с использованием JPA / EJB / JSF, и у меня возникли некоторые проблемы при разработке поддержки нескольких языков для сущностей. Есть три соответствующих объекта:
Язык (имеет идентификатор)
Компетентность (имеет идентификатор)
CompetenceName (имеет ссылку на компетенцию, ссылку на язык и строку)
Компетенция имеет ссылку «один ко многим» на CompetenceName, реализованную с помощью карты, содержащей один объект для каждого языка, для которого существует имя для компетенции. Обратите внимание, что компетенции созданыдинамично и поэтому их имена не могут существовать в комплекте ресурсов.
При размещении Компетенций на веб-странице я хочу, чтобы они отображались на языке текущего пользователя, вошедшего в систему, это сохраняется в управляемом компоненте 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-объекта сессионной области, который также не является хорошим решением.
У кого-нибудь есть какие-либо мысли или шаблоны проектирования по этому вопросу?