Ajuda com java.lang.AbstractMethodError

3 respostas
Takeshi91

Seguinte! :D

Estou trabalhando com upload de arquivos para um banco de dados, que devem ser inseridos num campo do tipo BLOB.

Meus procedimentos: - primeiro obtenho o UploadedFile (Classe da PrimeFaces) e sua InputStream; - depois crio uma instancia deste arquivo no próprio diretório do servidor da aplicação (pasta do tomcat, ele gera sozinho quando eu codifico:
public void handleFileUpload(FileUploadEvent event) throws IOException {
        setUf(event.getFile()); // uf é uma instancia de UploadedFile
        is = getUf().getInputstream(); // is é uma instancia de InputStream
        // -----------------------------------------------------------------
        File file = new File(getUf().getFileName());
}
- Crio um novo arquivo e escrevo a inputStream da upLoadedFile(is) numa new FileOutputStream do novo arquivo.

- Depois is é instanciado como uma nova FileInputStream do mesmo arquivo criado.

no banco de dados, faço a inserção via JDBC com o comando preparedStatement.setBinaryStream(i + 1, (FileInputStream) exemplo)

Segue o código para ficar mais facil o entendimento. Acima foi só um breve resumo.

Meu método que obtem o UploadedFile, cria arquivo temporario e obtem uma FileInputStream. Até aqui tudo ocorre perfeitamente.
public void handleFileUpload(FileUploadEvent event) throws IOException {
        setUf(event.getFile());
        is = getUf().getInputstream();
        // -----------------------------------------------------------------
        File file = new File(getUf().getFileName());
        FileOutputStream fos = new FileOutputStream(file);
        int count = 0;
        byte[] buf = new byte[8192];
        while ((count = is.read(buf)) != -1) {
            fos.write(buf, 0, count);
            //ops.write(buf, 0, count);
        }
        fos.flush();
        fos.close();
        is = new FileInputStream(file);
        System.out.println(file.getAbsolutePath());

    }
Meu método que faz a inserção no banco de dados:
public void addRevisao(List<Object> params) {
        String sql = "";
        Connection con = null;
        PreparedStatement ps = null;
        try {
            sql += "INSERT INTO TB_REVISAO(REVISAO, CAMINHO, ARQUIVO, NFOLHAS, ";
            sql += "OBS, ID_DOC, SEQUENCIAL, FORMATO, ARQUIVO_BLOB";
            sql += "TIPO, DATA_INC, ";
            sql += "USER_INC, DATA_REV, DATA_RECEBIMENTO) ";
            sql += "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            con = getCn();
            ps = con.prepareStatement(sql);
            for (int i = 0; i < params.size(); i++) {
                System.out.println(params.get(i).toString());
                if(params.get(i) instanceof InputStream){ // Levei um bom tempo pra perceber que setObject nao funcionava para Streams.
                    ps.setBinaryStream(i + 1, (FileInputStream) params.get(i));
                } else {
                    ps.setObject(i + 1, params.get(i));
                }
            }
            ps.executeUpdate();
            con.commit();
            System.out.println("DEU CERTO!");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            fechaPreparedStatement(ps);
        }
    }

3 Respostas

Takeshi91

Obs: tinha esquecido de mencionar o problema.

Quando tento dar setBinaryStream na FileInputStream, dá o erro do tópico. ‘-’

cidadaofred

Caro Takeshi91,

Também tive um problema com java.lang.AbstractMethodError.

No meu caso, sem entrar em detalhe da aplicação, o erro ocorria porque estava usando uma versão do drive para postgresql JDBC 1 (pg74.216.jdbc1.jar). E, a solução do problema surgiu quando fiz um upgrade do drive para a versão: JDBC 3 (pg74.216.jdbc3.jar).

A motivação para a solução do meu problema originou-se desta referência: java.lang.AbstractMethodError: With JDBC, that error usually occurs because your JDBC driver implements an older version of the JDBC API than the one included in your JRE. These older versions are fine so long as you don’t try and use a method that appeared in the newer API.

Espero ter ajudado.

Abraços.

Takeshi91

No banco de dados oracle, para voce entrar com um dado num campo BLOB você tem que passar a filelength como parâmetro em:

ps.setBinaryStream(i + 1, (FileInputStream) params.get(i), (Integer) file.length)

Tópico resolvido.

Criado 1 de abril de 2011
Ultima resposta 13 de abr. de 2011
Respostas 3
Participantes 2