- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试调用 mysql_pool.getConnection() 时,我总是遇到 NullPointerException(例如在登录方法中)
我在我的 Servlet 的 init() 中调用方法 initPool
package john.z.server;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import java.util.LinkedList;
import java.util.regex.*;
import java.security.GeneralSecurityException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import john.z.schafkopf.Player;
import john.z.schafkopf.SGame;
import john.z.server.crypto.Base64;
import john.z.server.crypto.PasswordSalts;
import john.z.server.crypto.Passwords;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.json.*;
public class SchafkopfServer extends WebSocketServlet implements
WebsocketListener {
public static DataSource mysql_pool;
LinkedList<Player> lobby;
LinkedList<SGame> gamelobby;
public static final String GREETING = "Schafkopf 0.1";
public void init(ServletConfig config) throws ServletException {
super.init(config);
initPool();
}
public SchafkopfServer(){
initPool();
lobby = new LinkedList<Player>();
gamelobby = new LinkedList<SGame>();
}
@Override
protected StreamInbound createWebSocketInbound(String subProtocol,
HttpServletRequest request) {
// TODO Auto-generated method stub
return new WSocketconnection(this);
}
public void initPool (){
if (mysql_pool == null) {
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:mysql://"+ System.getenv("OPENSHIFT_MYSQL_DB_HOST")+ ":" +System.getenv("OPENSHIFT_MYSQL_DB_PORT")+"/development");
p.setDriverClassName("com.mysql.jdbc.Driver");
p.setUsername("myusername");
p.setPassword("andmyownsecretpassword");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
DataSource mysql_pool = new DataSource();
mysql_pool.setPoolProperties(p);
}
}
@Override
public void receiveText(String message, WSocketconnection connection) {
// TODO Auto-generated method stub
initPool();
Pattern pat = Pattern.compile("login\\s(\\S+)\\s(\\S+)");
Matcher mat = pat.matcher(message);
boolean found = true;
if (mat.find()) {
login(mat.group(1), mat.group(2), connection);
found = false;
}
pat = Pattern.compile("register\\s(\\S+)\\s(\\S+)");
mat = pat.matcher(message);
if (mat.find()) {
register(mat.group(1), mat.group(2), connection);
found = false;
}
if (found){
connection.appendtomessage("Did Nothing");
}
connection.flushbuffer();
}
public void register (String uname, String pass,WSocketconnection connection){
Connection con = null;
PreparedStatement st = null;
try {
con = mysql_pool.getConnection();
st = con.prepareStatement("INSERT INTO schafkopf_users (uname , password, salt) VALUES (?,?,?)");
byte[] salt = PasswordSalts.nextSalt();
byte[] pw = null;
try {
pw = Passwords.hashPassword(pass.toCharArray(), salt);
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
connection.appendtomessage("ERROR: Internal Error");
return;
}
st.setString(1, uname);
st.setString(2, Base64.encode(pw));
st.setString(3,Base64.encode(salt));
connection.appendtomessage("register OK for name "+ uname + "\n");
st.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
connection.appendtomessage("ERROR: Internal DatabaseError: "+e.toString());
} finally {
// TODO Auto-generated catch block
if (con != null)
try {
con.close();
} catch (Exception ignore) {
}
if (st != null)
try {
st.close();
} catch (Exception ignore) {
}
}
}
public void sendgamelobby (WSocketconnection con){
StringBuilder build = new StringBuilder("gamelobby: ");
synchronized(gamelobby){
build.append( new JSONArray(gamelobby).toString());
}
build.append("\n");
con.writemessage(build.toString());
}
public void buffergamelobby (WSocketconnection con){
StringBuilder build = new StringBuilder("gamelobby: ");
synchronized(gamelobby){
build.append( new JSONArray(gamelobby).toString());
}
build.append("\n");
con.appendtomessage(build.toString());
}
public void login(String username, String pass, WSocketconnection connection) {
Connection con = null;enter code here
PreparedStatement st = null;
ResultSet result = null;
try {
if (mysql_pool == null){
connection.appendtomessage("Still empty");
initPool();
}
con = mysql_pool.getConnection();
st = con.prepareStatement("SELECT password , salt FROM schafkopf_users WHERE uname=(?)");
st.setString(1, username);
result = st.executeQuery();
byte[] pw = null;
byte[] salt = null;
if (result.next()) {
try {
pw = Base64.decode(result.getString("password"));
salt = Base64.decode(result.getString("salt"));
} catch (Exception E) {
connection.appendtomessage("ERROR: InternalError");
E.printStackTrace();
return;
}
} else {
connection.appendtomessage("ERROR: Usernotexistent");
return;
}
boolean matches = false;
try {
matches = Passwords.matches(pass.toCharArray(), pw, salt);
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
connection.appendtomessage("ERROR: InternalError");
e.printStackTrace();
return;
}
if (matches) {
connection.appendtomessage(username + " login OK");
Player newplayer = new Player(username);
connection.addlistener(newplayer);
lobby.add(newplayer);
}else{
connection.appendtomessage(username + " wrong password");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
connection.appendtomessage("ERROR: Internal error: "+ e.toString());
return;
} finally {
// TODO Auto-generated catch block
if (con != null)
try {
con.close();
} catch (Exception ignore) {
}
if (st != null)
try {
st.close();
} catch (Exception ignore) {
}
if (result != null)
try {
result.close();
} catch (Exception ignore) {
}
}
}
@Override
public String getmsgprefix() {
// TODO Auto-generated method stub
return "S";
}}
如果你们能帮帮我就好了
最佳答案
你得到一个 NullPointerException
因为字段 mysql_pool
被 initPool()
中同名的局部变量隐藏了方法
DataSource mysql_pool = new DataSource();
mysql_pool.setPoolProperties(p);
所以实例变量永远不会被初始化,因此是null
。当您尝试调用方法或访问 null
上的字段时,您会收到 NullPointerException
。
要修复它,将上面的更改为
mysql_pool = new DataSource(); // the instance field is being initialized
...
关于java - Tomcat7/JBoss 2 NullPointerException 与 MySQL- 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16704642/
我是 JBoss 的新手,发现了很多不同的术语 - JBoss EAP、JBoss Server、Wildfly、Jboss Web,以及很多不是最新的或针对旧版本的文档。 我从哪里开始了解 JBos
JBoss ESB 服务器之间有什么区别(可在此处获得:http://jbossesb.jboss.org/downloads/) 和 JBoss fuse ( http://www.jboss.or
我在我的 PC 上安装了 JBoss 4 到目录 C:\JBoss4 并将环境变量 JBOSS_HOME 设置为此目录: JBOSS_HOME=C:\JBoss4 我需要在同一台 PC 上安装 JB
我有一个 JBoss 服务器正在运行并且想要部署一个服务。 该服务连接到在以下 xml 文件中配置的数据库 jdbc:postgresql://localhost:543
jboss 中的超时是如何工作的?网络应用程序如何知道何时重定向到登录页面? 只是为了澄清! -我知道如何在 jboss 上配置超时。我的问题是,Jboss 如何知道 session 已超时以及何时超
使用JBoss Forge启动新项目时,默认情况下该项目是使用Maven构建系统创建的。我如何利用Forge 2. *的Gradle插件使用Gradle而不是Maven创建项目? % forge Us
当前配置: 正在运行的16个Pod,基于JBoss TCP的集群以及google ping发现。容器作为状态集部署在Kubernetes集群上。 没有负载的初始群集按预期运行,没有任何单个问题,但是当
我以为这将是一个 JBoss 常见问题解答,但我找不到它。 我想同时运行 JBoss 4 和 JBoss 5。我通过将端口的前导数字更改为 9 手动更改了 JBoss 5 服务器/默认实例上的所有端口
我们在 JBoss AS 6 上实现了一些服务作为我们希望迁移到 JBoss AS 7 的单例服务。 这些服务在 jboss-service.xml 文件中声明,该文件位于 EJB 包中,类似于以下代
例如,如何确定我的简单 JBoss 4.2.3 服务器正在监听端口 8080? 这是我最接近的一次,但这不起作用: MBeanServerConnection server = (MBeanServe
我正在尝试找到从语法上确定我的程序是在 Jboss 5 还是 Jboss 7 (eap-6.1) 上运行的最佳方法。到目前为止,我找到的方法是特定于 jboss 5 或 jboss 7 的,这不起作用
我在域模式下使用 JBoss 6.4.8 版本。我想通过 CLI 添加这 4 个系统属性: 1- /host=myserver/server-config=node/system-property=j
在 JBoss 4 中,您可以在文件中设置对象的部署顺序( .jar 、 .war 、 .sar 等...): conf/xmdesc/org.jboss.deployment.MainDeploye
概括地说,JBoss 5 的关闭有什么作用?如果我只是杀死 java 进程而不是优雅地关闭 JBoss,可能会出现什么问题? 对于我的应用程序来说,正常的 JBoss 5 关闭大约需要 6 分钟,这个
我最近在 CentOS 6.7 服务器上安装了 JBoss AS 7。 jboss as 工作正常。为了测试,我部署了一个 .war 文件并对其进行了测试,效果很好!但现在我尝试从我的台式电脑访问相同
我有 jboss 应用程序。并想自动测试部署。并希望将此任务作为项目添加到 Hudson 我的愿景基于以下阶段: 将我的应用程序放到 JBoss(复制耳朵、配置、库等) 运行 JBoss 我有一台 L
我对 JBoss 很陌生。目前我有一个需求,我需要在 JBoss 上部署应用程序(已经在 Tomcat 上运行)。我下载了 JBoss,但是版本 7 中的目录结构不同。 我正在运行 bin\stand
我是 JBoss AS 7 的新手。我尝试在 JBoss AS 7 上部署我的 war 文件,这似乎工作正常。我的问题是在哪里可以看到部署的内容。 我希望它像 Tomcat 一样,它应该有一个探索的
我使用多播方法在两个不同的 JBoss 服务器之间配置了集群。 当我启动两个 JBoss 服务器时,两个服务器都将连接。 一天后,我收到以下消息 server.log 中的群集开始显示错误 05:28
为了打开/关闭我们产品的跟踪-“类别”或“记录器”标签,我们应该在jboss-log4j.xml中使用什么? 默认情况下,JBoss在jboss-log4j.xml中使用“类别”。 但据我所知,不赞成
我是一名优秀的程序员,十分优秀!