No estoy seguro de si se trata de un problema complejo, pero como persona inicial me parece un poco complejo. Tengo un objeto basado en el cual necesito mostrar algunos valores en la interfaz de usuario y dejar que el usuario seleccione algunos de ellos. Debo enviar datos a otro controlador cuando el usuario haga clic en el botón Enviar. Aquí está la estructura de mi objeto de datosEncuadernación de un mapa de listas en Spring MVC
public class PrsData{
private Map<String, List<PrsCDData>> prsCDData;
}
public class PrsCDData{
private Map<String, Collection<ConfiguredDesignData>> configuredDesignData;
}
public ConfiguredDesignData{
// simple fields
}
I han establecido el objeto en el modelo antes de que muestra la vista como
model.addAttribute("prsData", productData.getPrData());
en la forma que he siguiente configuración
<form:form method="post" commandName="prsData" action="${addProductToCartAction}" >
<form:hidden path="prsCDData['${prsCDDataMap.key}']
[${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
[${configuredDesignDataStatus.index}].code"/>
<form:hidden path="prsCDData['${prsCDDataMap.key}']
[${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
[${configuredDesignDataStatus.index}].description"/>
</form:form>
Esto es lo que tengo en AddProductToCartController
public String addToCart(@RequestParam("productCodePost") final String code,
@ModelAttribute("prsData") final PrsData prsData, final Model model,
@RequestParam(value = "qty", required = false, defaultValue = "1") final long qty)
En la presentación de la forma que estoy recibiendo siguiente excepción
org.springframework.beans.NullValueInNestedPathException: Invalid property 'prsCDData[Forced][0]'
of bean class [com.product.data.PrsData]:
Cannot access indexed value of property referenced in indexed property path 'prsCDData[Forced][0]': returned null
Parece que su tratando de acceder a los valores de este controlador mientras yo estoy tratando de enviar el valor a ese controlador y tratando de crear el mismo objeto con los valores seleccionados
¿Puede alguien decirme dónde estoy haciendo mal y lo que tengo que cuidar
Editar
he hecho un poco más investigación y llegaron a conocer que la primavera no son compatibles con auto-poblar la lista/mapa de objetos personalizados y en base a la respuesta que trató de cambiar la aplicación como
public class PrsData{
private Map<String, List<PrsCDData>> prsCDData;
// lazy init
public PrsData()
{
this.prsCDData = MapUtils.lazyMap(new HashMap<String, List<PrsCDData>>(),
FactoryUtils.instantiateFactory(PrsCDData.class));
}
}
public class PrsCDData{
private Map<String, Collection<ConfiguredDesignData>> configuredDesignData;
public PrsCDData()
{
this.configuredDesignData = MapUtils.lazyMap(new HashMap<String,
List<ConfiguredDesignData>>(),
FactoryUtils.instantiateFactory(ConfiguredDesignData.class));
}
}
pero estoy consiguiendo siguiente excepción
org.springframework.beans.InvalidPropertyException:
Invalid property 'prsCDData[Forced][0]' of bean class [com.data.PrsData]:
Property referenced in indexed property path 'prsCDData[Forced][0]'
is neither an array nor a List nor a Set nor a Map;
returned value was [[email protected]]
no estoy seguro de lo que lo que estoy haciendo mal, parece que sea mi expresión JSTL no está bien
Otra cosa a tener en cuenta en este escenario es clases anidadas. Hacer 'PrsCDData' una clase de nivel superior podría evitar este problema. –