He pasado por la documentación de Spring y el código fuente y todavía no he encontrado respuesta a mi pregunta.Enlace de datos de una clase abstracta en spring-mvc
Tengo estas clases en mi modelo de dominio y quiero usarlas como objetos de formulario de respaldo en spring-mvc.
public abstract class Credentials {
private Long id;
....
}
public class UserPasswordCredentials extends Credentials {
private String username;
private String password;
....
}
public class UserAccount {
private Long id;
private String name;
private Credentials credentials;
....
}
Mi controlador:
@Controller
public class UserAccountController
{
@RequestMapping(value = "/saveAccount", method = RequestMethod.POST)
public @ResponseBody Long saveAccount(@Valid UserAccount account)
{
//persist in DB
return account.id;
}
@RequestMapping(value = "/listAccounts", method = RequestMethod.GET)
public String listAccounts()
{
//get all accounts from DB
return "views/list_accounts";
}
....
}
En la interfaz de usuario que tienen forma dinámica para los diferentes tipos de credenciales. Mi solicitud POST general se parece a:
name name
credentials_type user_name
credentials.password password
credentials.username username
excepción siguiente si trato de presentar solicitud al servidor:
org.springframework.beans.NullValueInNestedPathException: Invalid property 'credentials' of bean class [*.*.domain.UserAccount]: Could not instantiate property type [*.*.domain.Credentials] to auto-grow nested property path: java.lang.InstantiationException
org.springframework.beans.BeanWrapperImpl.newValue(BeanWrapperImpl.java:628)
Mi idea inicial era utilizar @ModelAttribute
@ModelAttribute
public PublisherAccount prepareUserAccountBean(@RequestParam("credentials_type") String credentialsType){
UserAccount userAccount = new PublisherAccount();
Class credClass = //figure out correct credentials class;
userAccount.setCredentials(BeanUtils.instantiate(credClass));
return userAccount;
}
Problema con este enfoque, se llama al método prepareUserAccountBean
antes que a cualquier otro método (como listAccounts
) que no sea apropiado.
Una solución robusta es mover ambos prepareUserAccountBean
y saveUserAccount
al controlador por separado. No suena bien: quiero que todas las operaciones relacionadas con el usuario residan en la misma clase de controlador.
¿Alguna solución simple? ¿Puedo utilizar de alguna manera DataBinder, PropertyEditor o WebArgumentResolver?
Gracias !!!!!
¿Puedes publicar el código completo de las clases de tu dominio? Me gustaría ver a tus constructores. –
Me parece que esto es más un problema de asignación/serialización/conversión con su base de datos que con la vista. ¿Las cuentas se deserializan correctamente en los objetos correctos antes de enviarlas a la vista? – DavidA