使用装饰的HtmlResponseWriter发布更改时,为什么会抛出VerifyError

时间:2012-07-24 10:35:43

标签: jsf-2 decorator verifyerror

使用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中的问题?

1 个答案:

答案 0 :(得分: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...
}

}