【问题标题】:JAX-WS @WebMethod Return User-Defined Data TypeJAX-WS @WebMethod 返回用户定义的数据类型
【发布时间】:2012-04-03 18:18:33
【问题描述】:

我正在尝试创建一个 jax-ws Web 服务,该服务将查询 mysql 数据库并从 @WebMethod 返回用户定义的数据类型。我首先尝试返回由 sql 导入提供的 sql.ResultSet。但是,JAXB 无法绑定它。所以我尝试返回一个String[][],但是在客户端读取结果时它显示所有空字段。

然后我尝试创建自己的数据类型,并且我知道我创建的类应该有一个默认构造函数和公共集,并获取该类中定义的所有变量。但我想返回一个结果集。我的网络服务的代码如下:

@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;
}

我不确定 String[][] 中的所有单元格都为空的原因是否是因为代码甚至没有到达 executeQuery();或者它的 jaxb 绑定不起作用。

我仍然不明白 jaxb 是如何工作的。如果有人有一个很好的例子来说明如何将 jaxws 与 jaxb 一起使用,我将不胜感激。我在互联网上找到的文档非常复杂。

【问题讨论】:

    标签: java eclipse web-services jaxb jax-ws


    【解决方案1】:

    在您的场景中,您将无法返回 ResultSet,因为 JAX-WS (JAX-B) 只能绑定简单的数据类型。看看this

    您返回数组的方法是解决此问题的最常见方法,并且在您的情况下应该足够了。

    您应该尝试调试您的应用程序以确保您的查询被触发并填充结果。

    我最好的选择是您在以下行之一中遇到错误:

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

    但是您的代码对我来说看起来不错,所以我只是在推测。确保您的数据库在线并尝试调试您的代码。

    玩得开心!

    【讨论】:

    • 你是绝对正确的。我的错误在 Class.forName("com.mysql.jdbc.Driver").newInstance();
    • 很高兴听到!我希望这也解决了您的其他问题!干杯
    • 感谢您的帮助。它确实指出了错误在哪里,但我仍然必须找出如何解决它。我对其他一些数据库 Java 应用程序尝试了相同的语句,并且它相应地工作。仍然不知道为什么它在这里不起作用。无论如何,感谢您指出:)
    • 欢迎您!嗯,很难说。确保驱动程序库由您的服务器或您的应用程序加载。也许您应该考虑让服务器管理您的 JDBC 连接。干杯!
    • 再一次你完全正确。将 mysqljdbc.jar 复制到 glassfish 的 lib 目录时,我确实设法解决了这个问题。正如法国人所说的怜悯:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多