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-объекта сессионной области, который также не является хорошим решением.

У кого-нибудь есть какие-либо мысли или шаблоны проектирования по этому вопросу?

Ответы на вопрос(1)

Ваш ответ на вопрос