Я получаю ClassCastException: WrappedPreparedStatementJDK8 не может быть приведен к SQLServerPreparedStatement - PullRequest
0 голосов
/ 12 марта 2020

Моя среда: Eclipse IDE для предприятия Java Разработчики, Версия: 2019-09 R (4.13.0)

Сервер: WildFly 13.0.0.Final

Я пытаюсь массовая загрузка данных на Sql сервер, и приведенный ниже код прекрасно работает на моем сервере WildFly с той же версией, но не работает на клиентском компьютере с тем же сервером wildfly с java .lang.ClassCastException: org.jboss.jca.adapters .jdb c .jdk8.WrappedPreparedStatementJDK8 не может быть приведен к com.microsoft.sqlserver.jdb c .SQLServerPreparedStatement в приведенной ниже инструкции:

SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement) con.prepareStatement(execStoredProc);

Вот полный код:

import com.microsoft.sqlserver.jdbc.SQLServerDataTable;
import com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement;

import java.sql.*;
import java.util.ArrayList;

public class DatabaseExtended extends Database {
    public DatabaseExtended(String assetDisposition, String assetDisposition_ds) {
        super(assetDisposition, assetDisposition_ds);
        // TODO Auto-generated constructor stub
    }

    public Object executeEstimateStructured(int iClientID, SQLServerDataTable sourceDataTable) {
        //boolean rs = false;
        ArrayList<String[]> lst = new ArrayList<String[]>();
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection con = DriverManager.getConnection(super.connectionUrl);
            Statement stmt = con.createStatement();
            String execStoredProc = "EXEC UploadEstimate ?,?";
            SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement) con.prepareStatement(execStoredProc);//<--Exception here
            pStmt.setInt(1, iClientID);
            pStmt.setStructured(2, "dbo.UT_Estimate", sourceDataTable);
            ResultSet rs = pStmt.executeQuery();
            int columnCount = rs.getMetaData().getColumnCount();

            while (rs.next()) {

                int i = 1;
                String[] cols = new String[columnCount];
                while (i <= columnCount) {
                    cols[i - 1] = rs.getString(i++);
                }
                lst.add(cols);
            }
            con.close();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return lst;
    }
}

При поиске по этому исключению я наткнулся на эту ссылку , в которой говорится о размещении файла jboss-deploy-structure. xml в папке WEB-INF с указанными зависимостями. Ниже приведена моя структура jboss-deploy-structure. xml file

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure> 
    <deployment>
        <dependencies>
            <module name="org.jboss.ironjacamar.jdbcadapters" slot="main"/>
            <module name="com.microsoft.sqlserver" slot="main"/>
        </dependencies>
    </deployment> 
</jboss-deployment-structure>

Я ссылался на файл ms sql -jdb c -7.4.1.jre8.jar в пути сборки, а также в структуре развертывания, чтобы зависимость была добавлена ​​в папку web-inf / lib.

Теперь после помещения этого файла jboss-deploy-structure. xml в папку web-inf и развертывания файла war, Я получаю следующее исключение. Я не уверен, что моя структура jboss-deploy-structure. xml правильная и находится ли она в правильной папке или нет. Не могли бы вы помочь?

ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /AD/control/UploadEstimates: java.lang.IllegalAccessError: tried to access class com.microsoft.sqlserver.jdbc.Util from class com.microsoft.sqlserver.jdbc.SQLServerDataTable
    at com.microsoft.sqlserver.jdbc.SQLServerDataTable.addColumnMetadata(SQLServerDataTable.java:83)
    at com.MyClient.AD.util.UploadEstimateUT.start(UploadEstimateUT.java:66)
    at com.MyClient.AD.util.UploadEstimates.doPost(UploadEstimates.java:107)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
    at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
    at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
    at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
    at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
    at java.lang.Thread.run(Thread.java:748)

Обновление 16 марта 2020 года

Это мой обновленный код с использованием операторов пакета:

    public String executeInboundEstimateBatchedStoredProc(int iClientID, SQLServerDataTable sourceDataTable) {
        String message="";
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection con = super.getConnection();
            String execStoredProc = "EXEC UploadEstimate ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";

            PreparedStatement pStmt = con.prepareStatement(execStoredProc);

            Iterator<Entry<Integer, Object[]>> itr1 = sourceDataTable.getIterator();
            while (itr1.hasNext()) {
                Object[] lst=  itr1.next().getValue();              
                int numColumns = lst.length;
                pStmt.setInt(1, iClientID);
                for (int i = 0; i < numColumns; i++) {
                    pStmt.setString(i+2, lst[i].toString());
                }
                // add single insert query
                pStmt.addBatch();
            }

            // Execute batch
            int[] counts = pStmt.executeBatch();

            if (pStmt != null) {
                pStmt.close();
            }
            if (con != null) {
                con.close();
            }
        }
        // Handle any errors that may have occurred.
        catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
            message=e.getMessage();
        }
        return message;
    }

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

U никогда не должен проверять тип возврата подготовленного оператора объекта соединения. Базовый драйвер, который зависит от платформы, может обеспечить собственную реализацию подготовленного оператора INTERFACE, который не касается пользователей. U должен работать только с методами publi c, предоставленными интерфейсом, и не копать дальше. В случае, если у вас нет ошибки, просто приведите ваш оператор к общему типу. PreparedStatement pStm = con.prepareStatememt (execStoredPro c), если вы имеете дело с процедурой, которую я предполагаю из вашего execStoredPro c, то используйте con.prepareCall () и сохраните ее в типе вызываемого оператора

0 голосов
/ 12 марта 2020

Это потому, что вы не должны разыгрывать PreparedStatement, а использовать разворачивание. con.prepareStatement (execStoredPro c) Развертка (SQLServerPreparedStatement.class).

...