1
December
2006

Проблема с 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.



19th
December 2, 2006 #

А как быть после модификации в случае локали US? Не луч?е ли было добавить новые properties для своего языка, сделав доступными их classloader’у?

February 21, 2007 #

Статья помогла, спасибо!
Только ковырять чужой jar не стал, а создал свой rowset-recource.jar, в котором размножил ресурсые файлы по надобности - RU, EN, US и т.д. и теперь деплои эти библиотеки вместе.

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> <pre>