使用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中的问题?
答案 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...
}
}