2011-06-10 58 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