2011-06-10 86 views
1

我正在將我的應用程序從JSF 1.2升級到JSF 2。JSF2語言環境處理程序

我遇到了以下問題。我有locale處理程序處理通過檢查請求的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中,這個類不推薦使用,並且在MyFaces中使用時會導致錯誤(NPE)。我試圖用簡單的ViewHandler來實現它,但是它迫使我在希望使用默認行爲的地方實現許多方法。

感謝您的幫助。

回答

2

您需要擴展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. 
    } 

} 
+0

我應該從getWrapped方法返回的的ViewHandler?有沒有辦法獲得默認的? – malejpavouk 2011-06-10 10:49:21

+0

只是在施工期間通過的那個。我用啓動片段更新了答案。 – BalusC 2011-06-10 10:50:14

+0

完美,適合我。它比我想象的更簡單,我正在尋找一個陷阱,但沒有:-)。非常感謝。 – malejpavouk 2011-06-10 10:58:26