【问题标题】:Seam Mail with JSF 2 / MyFaces使用 JSF 2 / MyFaces 的 Seam Mail
【发布时间】:2013-12-05 17:52:09
【问题描述】:

是否有人使用 JSF 的 MyFaces 2.1.x 实现来运行带有 JSF 2 的 Seam Mail (Seam 2.3)?

我无法让 Seam Mail 工作,因为无法创建 Seam 的 org.jboss.seam.faces.renderer 组件。它对com.sun.faces.facelets.Facelet 有一个类依赖,而这个类在 MyFaces 中不存在。

@Scope(ScopeType.STATELESS)
@BypassInterceptors
@Name("org.jboss.seam.faces.renderer")
@AutoCreate
@Install(value = true, precedence = Install.BUILT_IN,
  classDependencies = "com.sun.faces.facelets.Facelet")
public class FaceletsRenderer extends Renderer {
    ...
}

因此,以下语句失败并出现“@In 属性需要非空值”异常。

@In(create = true)
private Renderer renderer;

我能做什么?我还应该从 Mojarra 实现中添加 jsf-api 吗?!

干杯 弗兰克

【问题讨论】:

    标签: jsf-2 myfaces seam2


    【解决方案1】:

    好的,我修好了!

    我刚刚用我自己的组件替换了有问题的 Seam FaceletsRenderer:

    @Scope(ScopeType.STATELESS)
    @BypassInterceptors
    @Name("org.jboss.seam.faces.renderer")
    @AutoCreate
    @Install(value = true, precedence = Install.APPLICATION)
    // dependency to the evil Sun JSF class is removed:
    // , classDependencies = "com.sun.faces.facelets.Facelet")
    public class FaceletsRenderer extends Renderer {
    
        /**
         * Render the viewId, anything written to the JSF ResponseWriter is returned
         */
        @Override
        public String render(final String viewId) {
            // call our fixed RendererRequest class instead of the original one.
            de.jw.filesio.webapp.renderer.RendererRequest rendererRequest = new de.jw.filesio.webapp.renderer.RendererRequest(
                    viewId);
            try {
                rendererRequest.run();
            } catch (IOException e) {
                throw new RuntimeException("error rendering " + viewId, e);
            }
            return rendererRequest.getOutput();
        }
    
    }
    

    原来Seam-Ui 中的RendererRequest 类与Sun JSF 耦合得很好,所以你也必须替换它。只需修复方法faceletForViewId(String)。给你:

        /**
         * Get a Facelet for a URL
         */
        protected Facelet faceletForViewId(String viewId) throws IOException {
            URL url = ResourceLoader.instance().getResource(viewId);
            if (url == null) {
                throw new IllegalArgumentException("resource doesn't exist: " + viewId);
            }
    
            // OLD CODE tightly coupled to Sun JSF
            // return
            // ApplicationAssociate.getCurrentInstance().getFaceletFactory().getFacelet(url);
    
            // NEW CODE for MyFaces
            // see
            // http://stackoverflow.com/questions/15813582/how-to-programmatically-instantiate-a-composite-component-or-a-tag-component
            FaceletFactory ff = DefaultFaceletFactory.getInstance();
            if (ff == null) {
                FaceletViewDeclarationLanguage vdl = new FaceletViewDeclarationLanguage(facesContext);
    
                Method createCompiler = null;
                Method createFaceletFactory = null;
                try {
                    createCompiler = FaceletViewDeclarationLanguage.class.getDeclaredMethod("createCompiler",
                            FacesContext.class);
                    createFaceletFactory = FaceletViewDeclarationLanguage.class.getDeclaredMethod("createFaceletFactory",
                            FacesContext.class, org.apache.myfaces.view.facelets.compiler.Compiler.class);
                    createCompiler.setAccessible(true);
                    createFaceletFactory.setAccessible(true);
                    org.apache.myfaces.view.facelets.compiler.Compiler compiler = (org.apache.myfaces.view.facelets.compiler.Compiler) createCompiler
                            .invoke(vdl, facesContext);
                    ff = (FaceletFactory) createFaceletFactory.invoke(vdl, facesContext, compiler);
                } catch (Exception ex) {
                    log.error("Error creating FaceletFactory.", ex);
                }
    
            }
    
            Facelet facelet = null;
            try {
    
                facelet = ff.getFacelet(url);
    
            } catch (Exception ex) {
                log.error("Error creating facelet for url " + url, ex);
            }
    
            log.debug("Successfully created facelet for " + url + ": " + facelet);
    
            return facelet;
        }
    

    我希望这可以帮助其他人解决我的问题。

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2014-01-09
      • 1970-01-01
      • 2011-07-22
      • 2011-03-04
      相关资源
      最近更新 更多