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";
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 llamadovaluesMap
. Queremos extraer el mapa interno para la clave “Male” y luego asignar el valor correspondiente a la clave “income” a una propiedad del objetoRulesResponse
.Para extraer el mapa interno para “Male”, podemos utilizar el operador
Map()
en las condiciones de la regla de la siguiente manera:Aquí, primero obtenemos el
valuesMap
del objetoPremium
y lo almacenamos en$masterMap
. Luego utilizamos el operadorMap()
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 llamadaincome
.Luego podemos establecer el valor de la propiedad
abc
de$rulesResponse
utilizando el métodosetAbc()
.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!