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 を完全に制御する必要があるため、カスタム HtmlRenderer が必要です。重複するコードを減らすために、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 に答える