0

使用 JSF2 (Myfaces 2.0.12) 发布对 WebSphere 的更改时遇到问题。

每次我向本地服务器 (WebSphere) 发布更改时,我都会收到 java.lang.VerifyError。完全重新启动服务器后,应用程序可以根据我的更改顺利运行。

java.lang.VerifyError: com/sun/faces/renderkit/html_basic/HtmlResponseWriter.startElement(Ljava/lang/String;Ljavax/faces/component/UIComponent;)V

StackTrace 表明 ResponseWriter 有问题,实际上我们在那里做了一些更改;-) 出于可访问性的原因,我必须完全控制 HTML,因此我需要自定义 HtmlRenderers。为了减少重复代码,我用自己的方式装饰了从 FacesContext 获得的 ResponseWriter,并在顶部提供了额外的便利方法。

public class CustomResponseWriter<T extends UIInput & MyFormdataInterface> extends HtmlResponseWriter
{

    public CustomResponseWriter(ReponseWriter writer){
        super(writer, writer.getContentType(), writer.getCharacterEncoding());
    }

    public writeFancy(T component)
    {
    ...
        writeText(component.getMyFanceAttribute(), null);
    ...
    }
}

正如我所说,服务器重新启动后代码运行良好,所以我认为代码是正确的。但另一方面,此错误仅发生在我使用此 CustomReponseWriter 的页面上。

在新类中装饰 ResponseWriter 的想法有什么问题吗?或者这可能只是 WebSphere 中的一个问题?

4

1 回答 1

0

正如 lu4242 在他的评论中提到的,我将实现从装饰器更改为委托,问题就消失了。很高兴理解为什么会发生这种情况,但现在这里是更改的代码(在这种情况下,我不喜欢来自委托的冗长代码,但只要它有效)。

public class CustomResponseWriter<T extends UIInput & MyFormdataInterface> extends ResponseWriter
{
    private ResponseWriter delegateWriter;

    public CustomResponseWriter(ReponseWriter writer){
        this.delegateWriter = writer;
    }

    public writeFancy(T component)
    {
    ...
        writeText(component.getMyFanceAttribute(), null);
    ...
    }

    public String getContentType()
    {
        this.delegateWriter.getContentType();
    }

    //... and so on for all methods from ResponseWriter...
}

}

于 2012-07-25T06:07:25.927 回答