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.

Drools – extraer valor dentro de un mapa y asignar – error: no se puede resolver el método utilizando el modo estricto.

Gracias a @roddy por su respuesta a mi consulta aquí

Copiando y pegando desde antes para establecer el contexto:
Aquí está la estructura de mis datos:

public class Premium{

    private Map<String,Map<String,String>> valuesMap = new HashMap<String,Map<String,String>>();

    public Map<String, Map<String, String>> getValuesMap() {
       return valuesMap;
    }
}

Valores de muestra que estarán presentes dentro de esta ‘valuesMap’:

Map<String,String> m1= new HashMap<String,String>();
m1.put("death","100");
m1.put("income","50");

valuesMap.put("Male",m1);
valuesMap.put("Female",m2);
....

Gracias a @Roddy ahora puedo extraer el mapa ‘m1’ insertado dentro de ‘valuesMap’ para “Male”

rule "rule#7 testing me 001 "
when
    // la línea de abajo extrae 'valuesMap' del objeto Premium
    $pr:Premium($masterMap:valuesMap) 
    // ahora tengo acceso al mapa insertado para 'Male'
    Map( $male: this["Male"] ) from $masterMap

    // definiendo un objeto en el cual quiero asignar el valor obtenido del mapa para male
    $rulesResponse:RulesResponse();
then   
    System.out.println("rule#7 map " + $map);
    // aquí es donde en el siguiente código falla
    $rulesResponse.abc = $innerMap.get("income");
end

Cuando intento extraer la cadena del mapa contra la clave ‘income’ y asignarla al objeto ‘RulesResponse’, falla con:

[Error: unable to resolve method using strict-mode: java.lang.Object.get(java.lang.String)]
[Near : {... nse.abc = $innerMap.get("income"); ....}]

El objeto de respuesta es un POJO simple con un getter y un setter para el atributo ‘abc’

public class RulesResponse {
    private String abc = "";

    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }
}

Si intento asignar un valor codificado directamente, funciona y también se refleja después de que se ejecuta la regla

// esto funciona
$rulesResponse.abc = "valor codificado";
Tags:  

Answer

  1. Avatar for davy.ai

    Solución para acceder y asignar valores desde un Mapa anidado en Drools

    En el escenario dado, tenemos una clase Premium con un mapa anidado llamado valuesMap. Queremos extraer el mapa interno para la clave “Male” y luego asignar el valor correspondiente a la clave “income” a una propiedad del objeto RulesResponse.

    Para extraer el mapa interno para “Male”, podemos utilizar el operador Map() en las condiciones de la regla de la siguiente manera:

    rule "rule#7 testing me 001"
    when
        $pr: Premium($masterMap: valuesMap)
        Map($male: this["Male"]) from $masterMap
        $rulesResponse: RulesResponse()
    then
        String income = $male.get("income");
        $rulesResponse.setAbc(income);
    end
    

    Aquí, primero obtenemos el valuesMap del objeto Premium y lo almacenamos en $masterMap. Luego utilizamos el operador Map() para extraer el mapa interno para “Male” y lo almacenamos en $male.

    A continuación, creamos un objeto RulesResponse y lo almacenamos en $rulesResponse.

    Finalmente, en la consecuencia de la regla, obtenemos el valor para la clave “income” del mapa $male y lo almacenamos en una variable local llamada income.

    Luego podemos establecer el valor de la propiedad abc de $rulesResponse utilizando el método setAbc().

    Ten en cuenta que no estamos utilizando la variable $innerMap en ninguna parte de la regla, lo cual causaba el error en el código original.

    Además, asegúrate de importar correctamente la clase RulesResponse en el archivo de reglas.

    ¡Espero que esto te ayude!

Comments are closed.