gpt4 book ai didi

java - 如何在运行时检测可用的 MyFace 实现版本

转载 作者:行者123 更新时间:2023-12-02 05:47:55 28 4
gpt4 key购买 nike

主题标题确实说明了一切:

我想在运行时检测 MyFaces 的版本。这可能吗?

似乎有一个 discussion about this kind of feature很久以前,但我找不到任何内容,如果它已实现并且其中的链接已损坏。

MyFaces 2.0 及更高版本。Websphere 8.0.x

最佳答案

我终于found a solution 。每个类都有一个包对象,该对象具有用于获取规范版本、实现名称和实现版本的属性。当然,这些属性中的数据质量取决于实现,但是对于我迄今为止使用的实现来说,它工作得很好(规范版本是错误的,是实现版本的副本,但我可以接受)。

/**
* This method provides a convenient means of determining the JSF
* Specification version.
*
* @return JSF Specification version, e.g. 2.1
* @since 1.5
*/
public static String getSpecificationVersion() {
return FacesContext.getCurrentInstance().getClass().getPackage().getSpecificationVersion();
}

/**
* This method provides a convenient means of determining the JSF
* Implementation version.
*
* @return JSF Implementation version, e.g. 2.1.26
* @since 1.5
*/
public static String getImplementationVersion() {
return FacesContext.getCurrentInstance().getClass().getPackage().getImplementationVersion();
}

/**
* This method provides a convenient means of determining the JSF
* Implementation Title.
*
* @return JSF implementation title, e.g. Mojarra.
* @since 1.5
*/
public static String getImplementationTitle() {
return FacesContext.getCurrentInstance().getClass().getPackage().getImplementationTitle();
}

由于我需要在普通 servlet 中使用此信息,因此我还必须确保存在 FacesContext。幸运的是@BalusC has described how to do this 。如果不存在,您只需使用此类来创建一个新的 JSF LifeCycle。

public class FacesUtil {

// Getters -----------------------------------------------------------------------------------

public static FacesContext getFacesContext(
HttpServletRequest request, HttpServletResponse response)
{
// Get current FacesContext.
FacesContext facesContext = FacesContext.getCurrentInstance();

// Check current FacesContext.
if (facesContext == null) {

// Create new Lifecycle.
LifecycleFactory lifecycleFactory = (LifecycleFactory)
FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);

// Create new FacesContext.
FacesContextFactory contextFactory = (FacesContextFactory)
FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
facesContext = contextFactory.getFacesContext(
request.getSession().getServletContext(), request, response, lifecycle);

// Create new View.
UIViewRoot view = facesContext.getApplication().getViewHandler().createView(
facesContext, "");
facesContext.setViewRoot(view);

// Set current FacesContext.
FacesContextWrapper.setCurrentInstance(facesContext);
}

return facesContext;
}

// Helpers -----------------------------------------------------------------------------------

// Wrap the protected FacesContext.setCurrentInstance() in a inner class.
private static abstract class FacesContextWrapper extends FacesContext {
protected static void setCurrentInstance(FacesContext facesContext) {
FacesContext.setCurrentInstance(facesContext);
}
}

}

最后,由于我们使用 Primefaces,我们得到了一个包装的 Faces Context,它反过来生成 Primefaces 的版本信息,而不是 Myfaces/Mojarra 的版本信息。因此,我们必须检查它是否是 PrimeFacesContext,而不是 FacesContet.getCurrentInstance,如果是,则将其解开:

private static Object facesContext() {
FacesContext context = FacesContext.getCurrentInstance();
if (context == null)
return "No Jsf Context";
if (context instanceof PrimeFacesContext)
return ((PrimeFacesContext) context).getWrapped();
return context;
}

关于java - 如何在运行时检测可用的 MyFace 实现版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23866979/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com