December
Проблема с rowset.jar (NullPointerException)
Posted in: Базы данных, SQL, Oracle, Java technologies, J2SE |
Библиотека rowset.jar предоставляет набор имплементаций для таких интерфейсов, как CachedRowSet, FilteredRowSet, JoinRowSet и т.д, а также другие необходимые классы для работы с ними.
Чаще всего программистам приходится иметь дело именно с com.sun.rowset.CachedRowSetImpl. Этот класс позволяет кэшировать данные из data source (так сказать, работать в режиме off-line).
В этой статье я хочу рассказать о проблеме, которая возникла у меня при работе с библиотекой.
А именно, при попытке создать объект CachedRowSetImpl валился следующий Exception:
java.lang.NullPointerException at java.io.Reader.<init>(Reader.java:61) at java.io.InputStreamReader.<init>(InputStreamReader.java:80) at java.util.Properties.load(Properties.java:266) at java.util.PropertyResourceBundle .<init>(PropertyResourceBundle.java:96) at com.sun.rowset.JdbcRowSetResourceBundle.<init>(Unknown Source) at com.sun.rowset.JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(Unknown Source) at com.sun.rowset.CachedRowSetImpl .<init>(Unknown Source) at TestRowSet.main(TestRowSet.java:14)
После декомпиляции классов из jar-ника в глаза бросился следующий код из класса JdbcRowSetResourceBundle:
private JdbcRowSetResourceBundle() throws IOException {
Locale locale = Locale.getDefault();
String s = locale.getCountry();
if(!s.equals("") && !s.equals("US")) {
propResBundle = new PropertyResourceBundle(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(
"com/sun/rowset/RowSetResourceBundle_" + s + "." + "properties"));
} else {
propResBundle = new PropertyResourceBundle(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(
"com/sun/rowset/RowSetResourceBundle.properties"));
}
}
Естественно дядьки из SUN’a не потрудились запихнуть properties для нашей “щирої” локали :). Пришлось код немного переписать и все стало на свои места.
private JdbcRowSetResourceBundle() throws IOException {
Locale locale = Locale.getDefault();
String s = locale.getCountry();
if(s.equals("US")) {
propResBundle = new PropertyResourceBundle(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(
"com/sun/rowset/RowSetResourceBundle_" + s + "." + "properties"));
} else {
propResBundle = new PropertyResourceBundle(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(
"com/sun/rowset/RowSetResourceBundle.properties"));
}
}
Если Вы столкнулись с такой проблемой программируя под базы данных, здесь можно скачать исходный код и скомпилированную версию исправленного класса - JdbcRowSetResourceBundle (2 Kb). Просто подмените class в jar-нике.
Счастливо.
2 Comments »
RSS feed for comments on this post.
А как быть после модификации в случае локали US? Не лучше ли было добавить новые properties для своего языка, сделав доступными их classloader’у?
Статья помогла, спасибо!
Только ковырять чужой jar не стал, а создал свой rowset-recource.jar, в котором размножил ресурсые файлы по надобности - RU, EN, US и т.д. и теперь деплои эти библиотеки вместе.