#java #mysql #sql #utf-8
#java #mysql #sql #utf-8
Вопрос:
Я запускаю Tomcat WAR, который использует базу данных MySQL. Приложение будет работать на иностранных языках, поэтому мне пришлось изменить все символьные параметры базы данных на utf8.
Одна строка приложения (appPrefix) должна быть пустой (поскольку WAR развернут в корневом каталоге). Это работало хорошо, пока я не создал новую базу данных в UTF8 и не перенес все таблицы.
Теперь я получаю исключение NullPointerException из-за того, что appPrefix пуст:
java.lang.NullPointerException
com.horizon.servlet.PageServlet.doMainPageRequest(PageServlet.java:177)
com.horizon.servlet.PageServlet.doRequest(PageServlet.java:53)
com.horizon.servlet.PageServlet.doGet(PageServlet.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
com.horizon.filters.P3PFilter.doFilter(P3PFilter.java:19)
Приведенная выше ошибка вызывает сбои во всем приложении.
Все это вызвано тем, что appPrefix пуст, но так и должно быть..
Должен ли я указать его как пустой другим способом? Или я должен попытаться жестко закодировать свой способ обойти это?
РЕДАКТИРОВАТЬ: Согласно запросу в комментарии ниже, вот страница servlet.java:177
request.setAttribute("appPrefix", appManager.getAppStringById(11).getValue());
Это ссылается AppManager.java:
public static final int APP_STRING_APPLICATION_PREFIX = 11;
которое заполняется
public AppString getAppStringById(int id) {
AppString string = (AppString) stringCache.get(id);
if (string == null) {
String query = "SELECT * FROM app_strings WHERE id = ?";
List<Object> params = new LinkedList<Object>();
params.add(id);
string = execQueryLoadSingleRecord(query, params, new LoadAppString());
if (string != null) {
populateCache(stringCache, id, string);
}
}
return string;
}
Комментарии:
1. Как и в любом другом случае
RuntimeException
, это просто ошибка в вашем собственном коде. Пожалуйста, покажите код, лежащий в основеcom.horizon.servlet.PageServlet.doMainPageRequest(PageServlet.java:177)
2. Итак,
appManager.getAppStringById(11)
возвращеноnull
? Другими словами,execQueryLoadSingleRecord()
метод вернулnull
? Тогда почему оно возвращаетсяnull
?3. Получаемая запись базы данных пуста, как и должно быть.. Так не должно ли оно возвращать null? Это с чем-нибудь конфликтует? Пустая строка db не была проблемой, пока я не изменил кодировку базы данных на UTF8 с latin1 шведского по умолчанию!
Ответ №1:
Согласно
request.setAttribute("appPrefix", appManager.getAppStringById(11).getValue());
и
Получаемая запись базы данных пуста, как и должно быть.. Так не должно ли оно возвращать null? Это с чем-нибудь конфликтует? Пустая строка db не была проблемой, пока я не изменил кодировку базы данных на UTF8 с latin1 шведского по умолчанию!
Я понимаю, что это вообще не проблема, если appManager.getAppStringById(11)
возможно вернуть null
, верно? В этом случае вам следует проверить это перед вызовом getValue()
.
AppString appString = appManager.getAppStringById(11);
if (appString != null) {
request.setAttribute("appPrefix", appString.getValue());
}
Что касается того, почему он возвращается null
после того, как вы изменили кодировку таблицы; Я понятия не имею. Возможно, это просто большое совпадение или неправильная интерпретация проблемы. Возможно, вы добавили getValue()
call позже, потому что хотели использовать ${appPrefix}
вместо ${appPrefix.value}
в EL или что-то в этом роде. Или, возможно, вы переписали, execQueryLoadSingleRecord()
чтобы оно возвращало null
вместо пустой строки. Или, возможно, значение столбца по умолчанию null
вместо пустой строки. Или, возможно, это ошибка в используемом драйвере JDBC. Кто знает. Использование null
в качестве «нет значения» совершенно нормально и должно рассматриваться как таковое.