2011-09-07 18 views
8

Tengo una jerarquía de clases de modelo en mi aplicación Spring/Hibernate.Clases abstractas y Spring MVC @ ModelAttribute/@ RequestParam

Al enviar un formulario POST a un controlador Spring MVC, hay alguna forma estándar de especificar el tipo de objeto que se envía, para que Spring pueda instanciar la subclase correcta del tipo declarado en @ModelAttribute o @RequestParam del método de recepción ?

Por ejemplo:

public abstract class Product {...} 
public class Album extends Product {...} 
public class Single extends Product {...} 


//Meanwhile, in the controller... 
@RequestMapping("/submit.html") 
public ModelAndView addProduct(@ModelAttribute("product") @Valid Product product, BindingResult bindingResult, Model model) 
{ 
...//Do stuff, and get either an Album or Single 
} 

Jackson puede deserializar JSON como un subtipo concreto utilizando la anotación @JsonTypeInfo. Espero que Spring pueda hacer lo mismo.

Respuesta

6

Jackson puede deserializar JSON como un subtipo específico utilizando la anotación @JsonTypeInfo. Espero que Spring pueda hacer lo mismo.

Suponiendo que utilice Jackson por conversión de tipo (primavera utiliza Jackson automáticamente si se lo encuentra en la ruta de clase y tiene en su <mvc:annotation-driven/> XML), entonces no tiene nada que ver con la primavera. Anota los tipos, y Jackson instanciará las clases correctas. Sin embargo, tendrá que hacer comprobaciones instanceof en su método de controlador Spring MVC.

Update después de comentarios:

Para consultar todas 15.3.2.12 Customizing WebDataBinder initialization. Se podría utilizar un método @InitBinder que registra un editor basado en un parámetro de petición:

@InitBinder 
public void initBinder(WebDataBinder binder, HttpServletRequest request) { 
    String productType = request.getParam("type"); 

    PropertyEditor productEditor; 
    if("album".equalsIgnoreCase(productType)) { 
     productEditor = new AlbumEditor(); 
    } else if("album".equalsIgnoreCase(productType)) 
     productEditor = new SingleEditor(); 
    } else { 
     throw SomeNastyException(); 
    } 
    binder.registerCustomEditor(Product.class, productEditor); 
} 
+0

Gracias, lo que quería decir era es esto posible cuando _No_ la presentación de una carga útil de JSON, más bien una forma de POST presentación normal. –

+0

@Deejay ok actualizó mi respuesta –

+0

Hola, trato de resolver un problema similar, pero sin resultado ... esta es mi pregunta: http://stackoverflow.com/questions/21550238/how-instantiate-a-concrete-class- in-init-binder ¿me puedes ayudar? – Teo

Cuestiones relacionadas