Jsf 2 为什么在使用修饰的HtmlResponseWriter发布更改时引发VerifyError

Jsf 2 为什么在使用修饰的HtmlResponseWriter发布更改时引发VerifyError,jsf-2,decorator,verifyerror,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/c

使用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,所以我需要定制HTMLender。为了减少重复代码,我用自己的方法修饰了从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);
    ...
    }
}
公共类CustomResponseWriter扩展了HtmlResponseWriter
{
公共客户响应编写器(响应编写器){
super(writer,writer.getContentType(),writer.getCharacterEncoding());
}
公共写入能力(T组件)
{
...
writeText(component.getMyFanceAttribute(),null);
...
}
}
正如我所说,在服务器重新启动后代码运行良好,因此我假设代码是正确的。但另一方面,这个错误只发生在我使用这个CustomResponseWriter的页面上


在一个新的班级里装饰写手的想法有什么不对吗?或者这只是WebSphere中的一个问题?

正如lu4242在他的评论中提到的,我将实现从decorator更改为委托,问题消失了。理解为什么会发生这种情况会很好,但现在这里是更改后的代码(我不喜欢这种情况下委托的冗长代码,但只要它能工作)

公共类CustomResponseWriter扩展了ResponseWriter
{
私人回应作者授权作者;
公共客户响应编写器(响应编写器){
this.delegateWriter=writer;
}
公共写入能力(T组件)
{
...
writeText(component.getMyFanceAttribute(),null);
...
}
公共字符串getContentType()
{
this.delegateWriter.getContentType();
}
//…等等,对于ResponseWriter的所有方法。。。
}

}

您的类路径应该有问题,因为错误是从com/sun/faces类(Mojarra)抛出的,但是您说使用了MyFaces。创建一个从impl类扩展的类不是一个好主意,但它是有效的。也许在这种情况下使用委托模式更好。它起作用了!将decorator更改为委托解决了此问题。我确实更喜欢decorator,因为我不必实现/委托ResponseWriter的所有方法,但这并不是很多工作。很高兴知道为什么我不能装饰一个写手。
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...
}