添加到数据库rest webservice

时间:2014-05-26 09:43:22

标签: java sql xml web-services rest

我正在尝试创建一个rest webservice来向数据库添加元素。这是我的连接类

@Path(value="/user")
public class classeConnection {
    Connection cn=null;
    Statement st=null;
    public classeConnection()  {
      try  {
        Class.forName("com.mysql.jdbc.Driver");
      } catch (ClassNotFoundException e ){};
    }
    public void connecter ()throws SQLException  {
      cn= DriverManager.getConnection("jdbc:mysql://localhost:3306/codezone4", "root","");
      st=cn.createStatement();
      System.out.print("Ping!!");
    }
    public ResultSet execSelect(String req)throws SQLException {
        return(st.executeQuery(req));
    }
    @GET
    @Path (value="/add/{nom}/{prenom}/{email}/{login}/{psw}")
    @Produces(MediaType.APPLICATION_JSON)
    public String execMAJ(@PathParam(value="nom")String nom,
                              @PathParam(value="prenom")String prenom,
            @PathParam(value="email")String email ,@PathParam(value="login")String login,
            @PathParam(value="psw")String psw) throws SQLException  {
      String req;
          req="INSERT INTO user (nom,prenom,email,login,psw) values(
            '"+nom+"','"+prenom+"','"+email+"','"+login+"','"+psw+"')";
          int r=0;
          System.out.println(st);
          r=st.executeUpdate(req);
          System.out.println(st);
      return "succee d'ajout";
    }
    public void fermeture()throws SQLException {
          st.close(); // line 57
      cn.close();
    }
    public static void main(String[] args) throws SQLException {
        classeConnection c=new classeConnection();
        c.connecter();
    }
}

这是我的web.xml

<?xml version="1.0" encoding="ASCII"?>
<web-app 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0">
<display-name>rest</display-name>
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.server.provider.packages</param-name>
<param-value>com.example</param-value>
</init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/myrest/*</url-pattern>
</servlet-mapping>
</web-app>

当我使用url运行我的web服务时:/AddToDataBase/myrest/user/add/test/test/test@test.com/test/test,我收到此错误:

java.lang.NullPointerException
com.example.classeConnection.execMAJ(classeConnection.java:57)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

对此问题有任何建议吗?请帮忙!

2 个答案:

答案 0 :(得分:1)

方法void connecter()永远不会被调用,因此Statement对象没有被初始化并且它们保持为空。您可能应该将Statement对象更改为局部变量并在使用之前对其进行初始化,然后在使用它之后立即关闭该语句。 您可以对数据库连接执行相同的操作:

cn= DriverManager.getConnection("jdbc:mysql://localhost:3306/codezone4", "root","");

如果您需要更快的性能,则可以在应用程序启动时(而不是此类)打开数据库连接,然后在关闭时关闭。或者您可以使用ConnectionPool。

需要考虑的另一个问题是:

我们不允许在不对其进行编码的情况下在URL参数中传递特殊字符。 有关允许的字符列表,请参阅this question

您的测试网址应为/ AddToDataBase / myrest / user / add / test / test / test%40test.com / test / test

答案 1 :(得分:0)

不要在每个端点中请求新连接,这不是对数据库连接的良好使用。您应该使用中央连接池并将其注入,或者如果您不想使用DI,只需使用诸如http://www.mchange.com/projects/c3p0/之类的库创建具有单例类的连接池。