/ / c3p0 ResultSet.unwrap genera un AbstractMethodError - oracle, jdbc, c3p0

c3p0 ResultSet.unwrap genera un AbstractMethodError - oracle, jdbc, c3p0

Ho un oggetto ResultSet che ho bisogno di girarein un OracleResultSet in modo che possa richiamare il metodo getOPAQUE (String) su di esso. Sto usando c3p0 come pool di connessione.Il problema è che c3p0 esegue il wrapping dei ResultSet negli oggetti NewProxyResultSet.

Questo non dovrebbe essere un problema perché dovrei essere in grado di chiamare unwrap sul ResultSet in questo modo:

rs.unwrap(OracleResultSet.class)

Tuttavia, questo non funziona. In realtà genera un AbstractMethodError:

java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyResultSet.unwrap(Ljava/lang/Class;)Ljava/lang/Object;

Include una traccia dello stack, ma non è utileperché la linea superiore della traccia dello stack punta esattamente alla linea esatta su cui chiamo il metodo unwrap. Ciò sembra indicare che NewProxyResultSet stesso non ha implementato unwrap.

Che cosa succede con questo? Come posso prendere un NewProxyResultSet e ottenere un OracleResultSet da esso?

risposte:

4 per risposta № 1

Ho trovato un modo per ottenere il valore interiore! È un hack, ma funziona. Se qualcuno conosce un modo più portabile per ottenere il valore interiore (come far funzionare il metodo unwrap), allora mi piacerebbe farlo invece.

Ma, si scopre che la variabile "interna" di NewProxyResultSet è dichiarata protetta. Quindi faccio una classe nello stesso pacchetto di NewProxyResultSet e la uso per ottenere il valore interno in questo modo:

package com.mchange.v2.c3p0.impl;

import java.sql.ResultSet;

/**
* This is a sneaky way to get at the inner ResultSet of NewProxyResultSet. It marks the     variable as protected,
* so here I just make a class in the same package and get the value out.
*
*/
public class C3P0ResultSetPeeker
{
public static ResultSet getInnerFrom(NewProxyResultSet rs) {
return rs.inner;
}
}