java - 使用 netbeans 执行 Web 服务

标签 java mysql web-services jdbc netbeans

我想做一个网络服务,与本地主机上的一个数据库通信。数据库的名称是“Reservation”,只有一个名为“seats”的矩阵。这个表有4个字段:(int) ID,(varchar) location,(varchar) class (int) taken。例如,一条记录有以下字段:ID=1, location="Window", class="Economy", taken=0。我希望我的 Web 服务更新一条记录,该记录的字段为零。

我的代码是:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService( name = "Reservation", serviceName = "ReservationService" )
public class ReservationSOAP
{
   private static final String DATABASE_URL = "jdbc:mysql://localhost:8080/Reservation";
   private static final String USERNAME = "root";
   private static final String PASSWORD = "root";

   private Connection connection;
   private PreparedStatement lookupSeat;
   private PreparedStatement reserveSeat;

   // a WebMethod that can reserve a seat
   @WebMethod( operationName = "reserve" )
   public boolean reserve( @WebParam( name = "seatType" ) String seatType, @WebParam( name = "classType" ) String classType )
   {
      try
      {
         connection = DriverManager.getConnection( DATABASE_URL, USERNAME, PASSWORD );
         lookupSeat = connection.prepareStatement( "SELECT ID FROM seats WHERE taken = ? AND location = ? AND class = ?" );

         lookupSeat.setInt( 1, 0 );
         lookupSeat.setString( 2, seatType );
         lookupSeat.setString( 3, classType );

         ResultSet resultSet = lookupSeat.executeQuery();

         // if requested seat is available, reserve it
         while ( resultSet.next() )
         {
            int seat = resultSet.getInt( 1 );
            reserveSeat = connection.prepareStatement( "UPDATE seats SET taken = 1 WHERE ID = ?" );
            reserveSeat.setInt( 1, seat );
            reserveSeat.executeUpdate();
            return true;
         } // end if

         return false;
      } // end try
      catch ( SQLException e )
      {
         e.printStackTrace();
         return false;
      } // end catch
      catch ( Exception e )
      {
         e.printStackTrace();
         return false;
      } // end catch
      finally
      {
         try
         {
            lookupSeat.close();
            reserveSeat.close();
            connection.close();
         } // end try
         catch ( Exception e )
         {
            e.printStackTrace();
            return false;
         } // end catch
      } // end finally
   } // end WebMethod reserve
} // end class Reservation

问题是 web 方法返回 False,因为数据库没有更新。

最佳答案

首先 - 你应该使用 try-with-resource。您的语句 reserveSeat 可能仍然是 null 在您的 finally block 中抛出 NullPointerException,导致返回 false。 ResultSet 从不 关闭。

您在 while() 的右大括号上注释 //end if

我会为您的代码推荐局部变量。

考虑这个改变的实现。我还加入了一些 System.out.println,使您能够检查接收到的参数是否真的适用于您的 SQL。

@WebService(name = "Reservation", serviceName = "ReservationService")
public class ReservationSOAP {
    private static final String DATABASE_URL = "jdbc:mysql://localhost:8080/Reservation";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";

    // a WebMethod that can reserve a seat
    @WebMethod(operationName = "reserve")
    public boolean reserve(@WebParam(name = "seatType") String seatType,
            @WebParam(name = "classType") String classType) {
        try (Connection connection = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
                PreparedStatement lookupSeat = connection
                        .prepareStatement("SELECT ID FROM seats WHERE taken = ? AND location = ? AND class = ?")) {
            System.out.println("seatType: " + seatType);
            System.out.println("classType: " + classType);
            lookupSeat.setInt(1, 0);
            lookupSeat.setString(2, seatType);
            lookupSeat.setString(3, classType);

            try (ResultSet resultSet = lookupSeat.executeQuery()) {

                // if requested seat is available, reserve it
                if (resultSet.next()) {
                    int seat = resultSet.getInt(1);
                    System.out.println(
                            "Found unreserved seat: " + seat + " in class " + classType + " and seatType " + seatType);
                    try (PreparedStatement reserveSeat = connection
                            .prepareStatement("UPDATE seats SET taken = 1 WHERE ID = ?")) {
                        reserveSeat.setInt(1, seat);
                        reserveSeat.executeUpdate();
                        return true;
                    }

                }
            }
            System.out.println("No Seat found.");
            return false;
        } // end try
        catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    } // end WebMethod reserve
} // end class Reservation

关于java - 使用 netbeans 执行 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580767/

相关文章:

php - 增加mysql连接数

php - mysql 查询 : query nested (? )

php - 使用 SOAP 和 PHP 连接到 Web 服务

web-services - 使用 RabbitMQ 使本地内存缓存失效的陷阱

java - Socket如何相互发送数据?

java - 无限循环。拖延程序

java - LibGDX:皮肤+自定义坐标绘制不正确

mysql - 如何通过sql查询对条件进行排序

java - java Rest请求时偶尔出现"407 Proxy Authentication Required"错误

javascript - 在传单中创建一个圆圈而不重新加载 WebView