2011-09-07 17 views
8

Mam hierarchię klas modeli w mojej aplikacji Spring/Hibernate.Klasy abstrakcyjne i Spring MVC @ ModelAttribute/@ RequestParam

Po przesłaniu formularza POST do kontrolera Spring MVC, istnieje standardowy sposób określania typu przesyłanego obiektu, więc Spring może utworzyć instancję odpowiedniej klasy podanej w metodzie @ModelAttribute lub @RequestParam metody receive ?

Na przykład

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 może deserializowania JSON jako specyficznego podtypu stosując adnotacji @JsonTypeInfo. Mam nadzieję, że Spring może zrobić to samo.

Odpowiedz

6

Jackson może deserializować JSON jako określony podtyp przy użyciu adnotacji @JsonTypeInfo. Mam nadzieję, że Spring może zrobić to samo.

Zakładając użyć Jacksona dla typu konwersji (wiosna wykorzystuje Jackson automatycznie, jeżeli stwierdzi jej na ścieżce klasy i masz <mvc:annotation-driven/> w swoim XML), to nie ma nic wspólnego z wiosną. Adnotuj typy, a Jackson stworzy odpowiednie klasy. Niemniej jednak będziesz musiał wykonać kontrole instanceof w swojej kontroler Spring MVC.

Aktualizacja po komentarzach:

Wystarczy popatrzeć na 15.3.2.12 Customizing WebDataBinder initialization. Można użyć metody @InitBinder który rejestruje edytor oparty na parametrze żądanie:

@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

Dzięki, co miałem na myśli było to możliwe, gdy _nie_ złożenie ładunek JSON, raczej normalne przesyłanie formularza POST. –

+0

@Deejay ok zaktualizował moją odpowiedź –

+0

Witam, próbuję rozwiązać podobny problem, ale bez rezultatu .. to mam moje pytanie: http://stackoverflow.com/questions/21550238/how-instantiate--concrete-class- in-init-binder czy możesz mi pomóc? – Teo

Powiązane problemy