我正在运行使用MySQL数据库的Tomcat WAR。 应用程序将以外语运行,因此我必须将所有数据库字符参数更改为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为空引起,但它应该......
我应该以另一种方式将其指定为空吗?或者我应该尝试对此进行硬编码?
修改 根据下面评论中的请求,这里是PageServlet.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;
}
答案 0 :(得分:1)
根据
request.setAttribute("appPrefix", appManager.getAppStringById(11).getValue());
和
它获取的数据库条目是空的,因为它应该..所以不应该返回null?这与任何事情都有冲突吗?在我将数据库的编码从默认的latin1瑞典语更改为UTF8之前,db字符串为空是没有问题的!
我理解,如果appManager.getAppStringById(11)
可能返回null
,那根本不是问题,对吧?在这种情况下,您应该在调用getValue()
之前检查它。
AppString appString = appManager.getAppStringById(11);
if (appString != null) {
request.setAttribute("appPrefix", appString.getValue());
}
至于为什么在更改表的字符集后它返回null
;我不知道。也许这只是巧合或对问题的误解。也许您之后添加了getValue()
来电,因为您想在EL中使用${appPrefix}
而不是${appPrefix.value}
。或者你重写execQueryLoadSingleRecord()
它返回null
而不是空字符串。或者列的默认值可能是null
而不是空字符串。或许这是使用的JDBC驱动程序中的错误。谁知道。使用null
作为“无价值”是完全正确的,应该这样对待。