es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Presto o Trino UDF personalizado que muestra el error “no coinciden los tipos de datos esperados en Java”.

He creado una UDF personalizada que está registrada, pero cuando intento ejecutar select do_protect('abc@test.com','Test_EMAIL'); obtengo el siguiente error:

io.trino.spi.TrinoException: La implementación exacta de do_protect no coincide con los tipos de Java esperados

Aquí está mi UDF de Trino. Quiero pasar dos parámetros de tipo cadena (VARCHAR).

@ScalarFunction("do_protect")
@Description("Devuelve una cadena encriptada")
@SqlType(StandardTypes.VARCHAR)
public String protectUDF(@SqlType(StandardTypes.VARCHAR) Slice slice1, @SqlType(StandardTypes.VARCHAR) Slice slice2) throws PrivaceraException {
        logger.info("Se llama a protectUDF...");

    String valueForEncrypt = slice1.toString();
    logger.info("AS :: valueForEncrypt :: "+valueForEncrypt);
    String schemeForEncrypt = slice2.toString();
    logger.info("AS :: schemeForEncrypt :: "+schemeForEncrypt);

}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “io.trino.spi.TrinoException: La implementación exacta de do_protect no coincide con los tipos esperados de Java” indica que los argumentos pasados a la función do_protect no coinciden con los tipos de Java esperados. Según el código proporcionado, la función protectUDF espera dos argumentos de tipo SqlType.VARCHAR, pero la función do_protect está pasando argumentos de tipo VARCHAR.

    Para solucionar este problema, puedes modificar la función do_protect para que pase argumentos de tipo SqlType.VARCHAR, de la siguiente manera:

    SELECT do_protect(cast('abc@test.com' as varchar), cast('Test_EMAIL' as varchar))
    

    Alternativamente, puedes modificar la función protectUDF para que acepte argumentos de tipo VARCHAR, de la siguiente manera:

    @ScalarFunction("do_protect")
    @Description("Devuelve una cadena encriptada")
    public String protectUDF(String slice1, String slice2) throws PrivaceraException {
            logger.info("protectUDF se llama...");
    
            String valueForEncrypt = slice1.toString();
            logger.info("AS :: valueForEncrypt :: "+valueForEncrypt);
            String schemeForEncrypt = slice2.toString();
            logger.info("AS :: schemeForEncrypt :: "+schemeForEncrypt);
    }
    

    Espero que esto ayude a resolver tu problema.

Comments are closed.