#localization #jsf-2
#локализация #jsf-2
Вопрос:
Я обновляю свое приложение до JSF 2 с JSF 1.2.
Я столкнулся со следующей проблемой. У меня был обработчик языка, который обрабатывал язык, используемый при проверке URL запроса.
@Configurable
public class MutationViewHandler extends FaceletViewHandler {
@Autowired
private LanguageMutationServiceIface mutationService;
public MutationViewHandler(ViewHandler parent) {
super(parent);
}
@Override
public Locale calculateLocale(FacesContext context) {
String mutation = FacesUtil.getRequestParameter("mutation");
if (mutation == null) {
return new Locale(mutationService.getDefaultLanguageMutation().getName());
} else {
return new Locale(mutation);
}
}
}
Но в JSF 2 этот класс устарел и вызывает ошибку (NPE) при использовании в MyFaces. Я пытался реализовать это с помощью простого ViewHandler, но это вынуждает меня реализовывать множество методов, в которых я хотел бы использовать поведение по умолчанию.
Заранее спасибо за помощь.
Ответ №1:
Вместо этого вам нужно расширить ViewHandlerWrapper
.
Предоставляет простую реализацию
ViewHandler
, которая может быть подклассом для разработчиков, желающих обеспечить специализированное поведение для существующегоViewHandler
экземпляра. Реализация всех методов по умолчанию заключается в вызове через обернутыйViewHandler
.Использование: расширьте этот класс и переопределите
getWrapped()
, чтобы вернуть экземпляр, который мы упаковываем.
Итак, вы можете просто сделать
public class MyViewHandler extends ViewHandlerWrapper {
private ViewHandler wrapped;
public MyViewHandler(ViewHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ViewHandler getWrapped() {
return wrapped;
}
@Override
public Locale calculateLocale(FacesContext context) {
// Do your thing here.
}
}
Комментарии:
1. Какой ViewHandler я должен вернуть из метода getWrapped? Есть ли какой-либо способ получить значение по умолчанию?
2. Только тот, который был передан во время сборки. Я обновил ответ начальным фрагментом.
3. идеально, работает для меня. Это проще, чем я думал, я искал подводный камень, но его не было :-). Большое спасибо.