JAX-WS @WebMethod Возвращает пользовательский тип данных - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь создать веб-сервис jax-ws, который будет запрашивать базу данных mysql и возвращать определенный пользователем тип данных из @WebMethod.Сначала я попытался вернуть sql.ResultSet, который предоставляется при импорте sql.Тем не менее, JAXB не мог связать это.Поэтому я попытался вернуть String [] [], но при чтении результата в клиенте отображаются все пустые поля.

Затем я попытался создать свой собственный тип данных, и я понимаю, что класс, который я создаю, должен иметьконструктор по умолчанию и public устанавливает и получает все переменные, определенные в этом классе.Но я хотел бы вернуть набор результатов.Код моего веб-сервиса выглядит следующим образом:

@WebMethod
public String[][] getSummary(int month, int year){
    // register jdbc driver
    try
    {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
    }
    catch(Exception ex)
    {
        System.out.print(ex.getMessage());
    }

    // declare connection, statement and result set
    Connection connection = null;
    Statement statement = null;
    ResultSet resultset = null;

    String[][] result = new String[30][8];
    int counter = 0;

    try
    {
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/Livestock?user=root");
        statement = connection.createStatement();
        resultset = statement.executeQuery("SELECT Category, Particulars, Nos, OriginalCost, AccuDep, WDV, NRV, CapLoss FROM TB_SUMMARY WHERE Month=" + month + " AND Year=" + year);

        // loop over result set
        while(resultset.next())
        {
            result[counter][0] = resultset.getString("Category");
            result[counter][1] = resultset.getString("Particulars");
            result[counter][2] = resultset.getString("Nos");
            result[counter][3] = resultset.getString("OriginalCost");
            result[counter][4] = resultset.getString("AccuDep");
            result[counter][5] = resultset.getString("WDV");
            result[counter][6] = resultset.getString("NRV");
            result[counter][7] = resultset.getString("CapLoss");

            counter++;
        }           
    }
    catch(SQLException ex)
    {
        System.out.println("SQLException: " + ex.getMessage());
        System.out.println("SQLState: " + ex.getSQLState());
        System.out.println("VendorError: " + ex.getErrorCode());
    }
    finally
    {
        // it is a good idea to release
        // resources in a finally{} block
        // in reverse-order of their creation
        // if they are no-longer needed
        if(resultset != null)
            try 
            {
                resultset.close();
            } 
            catch (SQLException e) 
            {
                e.printStackTrace();
            }

        resultset = null;

        if(statement != null)
            try 
            {
                statement.close();
            }
            catch (SQLException e) 
            {
                e.printStackTrace();
            }

        statement = null;
    }

    return result;
}

Я не уверен, что причина, по которой все ячейки в строке [] [] равны нулю, заключается в том, что код даже не достигает executeQuery();или, может быть, не работает привязка jaxb.

Я до сих пор не понимаю, как работает jaxb.Если у кого-нибудь есть хороший пример использования jaxws с jaxb, я был бы очень признателен.Документация, которую я нашел в интернете, огромна и сложна.

1 Ответ

3 голосов
/ 19 марта 2012

В вашем сценарии вы не сможете вернуть ResultSet, потому что JAX-WS (JAX-B) может связывать только простые типы данных. Посмотрите на это .

Ваш подход к возвращению массива является наиболее распространенным, чтобы обойти эту проблему, и его должно быть достаточно в вашем случае.

Вы должны попытаться отладить приложение, чтобы убедиться, что ваш запрос запущен и результат заполнен.

Лучше всего, если вы получите ошибки в одной из следующих строк:

.

Class.forName ( "com.mysql.jdbc.Driver") newInstance ();
connection = DriverManager.getConnection ("jdbc: mysql: // localhost: 3306 / Livestock? user = root");

Но твой код выглядит хорошо для меня, поэтому я только размышляю. Убедитесь, что ваша БД подключена и попробуйте отладить ваш код.

Веселись!

...