2011-09-07 25 views
8

Ho una gerarchia di classi di modelli nella mia applicazione Spring/Hibernate.Classi astratte e Spring MVC @ ModelAttribute/@ RequestParam

Quando si invia un modulo POST a un controller MVC Spring, esiste un modo standard per specificare il tipo di oggetto inviato, quindi Spring può creare un'istanza della sottoclasse corretta del tipo dichiarato nel metodo di ricezione @ModelAttribute o @RequestParam ?

Ad esempio:

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 può deserializzare JSON come un sottotipo specifico utilizzando l'annotazione @JsonTypeInfo. Spero che Spring possa fare lo stesso.

risposta

6

Jackson può deserializzare JSON come sottotipo specifico utilizzando l'annotazione @JsonTypeInfo. Spero che Spring possa fare lo stesso.

Supponendo di usare Jackson per la conversione (primavera utilizza automaticamente Jackson se la trova nel classpath e hai <mvc:annotation-driven/> in XML), quindi non ha nulla a che fare con la Primavera. Annota i tipi e Jackson istanzia le classi corrette. Tuttavia, dovrai eseguire i controlli instanceof nel metodo del controller Spring MVC.

aggiornamento dopo i commenti:

Date un'occhiata al 15.3.2.12 Customizing WebDataBinder initialization. Si potrebbe utilizzare un metodo @InitBinder che registra un editore sulla base di un parametro di richiesta:

@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

Grazie, quello che volevo dire era questo è possibile quando _not_ presentazione di un carico utile JSON, piuttosto una normale forma POST sottomissione. –

+0

@Deejay ok aggiornato la mia risposta –

+0

Ciao, provo a risolvere un problema simile, ma senza risultato .. questa la mia domanda: http://stackoverflow.com/questions/21550238/how-instantiate-a-concrete-class- in-init-binder puoi aiutarmi ?? – Teo

Problemi correlati