Обработчик языка JSF2

#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. идеально, работает для меня. Это проще, чем я думал, я искал подводный камень, но его не было :-). Большое спасибо.