2013-11-14 1 views
4

Что касается нашего недавнего перехода от WSED 5.2 в RAD 7.5, в нашем коде появилась ошибка обмана приложения.Конфликт между StaticWriter и Writer Классы

RAD 7.5 маркирует константы выглядит, все в декларации заголовка класса (открытый класс FoStringWriter расширяет StringWriter реализует FoWriter {)

- Exception IOException in throws clause of Writer.append(CharSequence, int, int) is not compatable with StringWriter.append(CharSequence, int, int) 
- Exception IOException in throws clause of Writer.append(char) is not compatable with StringWriter.append(char) 
- Exception IOException in throws clause of Writer.append(CharSequence) is not compatable with StringWriter.append(CharSequence) 

Каждая часть литературы я смог найти на веб указывает на это «ошибка» в Eclipse, но у моего разработчика уже должна быть последняя версия программного обеспечения Eclipse. Поэтому я не знаю, что делать с этой ошибкой. Есть ли исправление от IBM, которое я просто еще не обновил? Или есть исправление кода, которое могло бы устранить эту ошибку?

public class FoStringWriter extends StringWriter implements FoWriter { 

public void filteredWrite(String str) throws IOException { 
FoStringWriter.filteredWrite(str,this); 
} 

public static void filteredWrite(String str, StringWriter writer) throws IOException { 
    if (str == null) str = ""; 
    TagUtils tagUtils = TagUtils.getInstance(); 
    str = tagUtils.filter(str); 
    HashMap dictionary = new HashMap(); 
    dictionary.put("&#","&#"); 
    str = GeneralUtils.translate(str,dictionary); 
    writer.write(str);  
} 

}

Editory Примечание:

Процесс, что это работает, создает PDF документы для нашего приложения. В WSED 5.5 он работал, имел несколько ошибок, но ничего не мешало писать PDF.

+1

Есть ли причина сделать 'FoStringWriter' подкласс класса' StringWriter'? Сделать его подклассом 'FilterWriter', который делегирует произвольный' Writer' (который * может * быть 'StringWriter'), кажется, более естественным. И это может решить вашу проблему компиляции как побочный эффект. – Holger

+0

@Holger Я пробовал это по вашему предложению, но, похоже, для меня совершенно другая проблема. Исключено исключение, созданное в одном из сервисных методов действия сервлета в приложении wpm. Исключение создано: javax.servlet.ServletException: java.lang.NoSuchMethodError: ny/dol/wpm/pdf/FoStringWriter. (Ljava/io/Writer;) V Обратите внимание, что мне пришлось изменить вызов FoStringWriter в других классах, потому что нет конструктора FilterWrite, у которого нет параметра, который был ранее вызван FoStringwriter. Мне также пришлось добавить конструктор (писатель). – Zibbobz

+1

«NoSuchMethodError» указывает, что не все классы были обновлены правильно. Кстати, добавить к конструктору по умолчанию новый 'FoStringWriter', который создает' StringWriter' как target 'Writer' и передает его суперструктору. Но большая проблема заключается в том, что ошибка говорит о том, что конструктор, берущий автора, не найден, поэтому сам класс FoStringWriter не обновлен. – Holger

ответ

1

Шлепайте меня в лоб, потому что это еще одна «ошибка», решаемая кажущимся полностью очевидным ответом.

Просто добавив перечисленные методы, которые бросают «ошибки», я могу устранить ошибку при вызове этого класса.

Копирование их прямо из StringWriter фактически сработало, не редактируя их каким-либо образом.

public StringWriter append(char c) { 
    write(c); 
    return this; 
} 

public StringWriter append(CharSequence csq) { 
    if (csq == null) 
     write("null"); 
    else 
     write(csq.toString()); 
     return this; 
} 

public StringWriter append(CharSequence csq, int start, int end) { 
    CharSequence cs = (csq == null ? "null" : csq); 
    write(cs.subSequence(start, end).toString()); 
     return this; 
} 

Я так рад, что это сработало, и в то же время разочарования, что это было так вопиюще просто исправить, что потребовалось почти целая неделя, чтобы выяснить.

Я полагаю, причина, по которой эта ошибка, вероятно, является конфликтом в реализации. FoStringWriter расширяет StringWriter, но сам он расширяет Writer, и оба класса имеют свои собственные методы «добавления», которые перезаписывают друг друга. Создав их явно, эта ошибка разрешена.