2011-09-07 5 views
8

मेरे स्प्रिंग/हाइबरनेट एप्लिकेशन में मॉडल कक्षाओं का पदानुक्रम है।सार कक्षाएं और स्प्रिंग एमवीसी @ मॉडलएट्रिब्यूट/@ अनुरोधपाराम

स्प्रिंग एमवीसी नियंत्रक को पोस्ट फॉर्म सबमिट करते समय, ऑब्जेक्ट के प्रकार को निर्दिष्ट करने का कोई मानक तरीका है, इसलिए वसंत प्राप्त करने वाले विधि के @ModelAttribute या @RequestParam में घोषित प्रकार के सही उप-वर्ग को तुरंत चालू कर सकता है ?

उदाहरण के लिए:

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 
} 

जैक्सन एक विशिष्ट उप प्रकार @JsonTypeInfo एनोटेशन का उपयोग कर के रूप में JSON deserialize कर सकते हैं। मुझे उम्मीद है कि वसंत भी ऐसा ही कर सकता है।

उत्तर

6

जैक्सन @JsonTypeInfo एनोटेशन का उपयोग कर एक विशिष्ट उप-प्रकार के रूप में JSON deserialize कर सकते हैं। मुझे उम्मीद है कि वसंत भी ऐसा ही कर सकता है।

आप प्रकार रूपांतरण के लिए जैक्सन का उपयोग (अगर यह classpath पर यह पाता है और आप अपने एक्सएमएल में <mvc:annotation-driven/> है वसंत स्वचालित रूप से जैक्सन का उपयोग करता है) मान लिया जाये, तो यह वसंत के साथ कोई संबंध नहीं है। प्रकारों को एनोटेट करें, और जैक्सन सही कक्षाओं को तुरंत चालू करेगा। फिर भी, आपको अपने स्प्रिंग एमवीसी नियंत्रक विधि में instanceof चेक करना होगा।

अद्यतन टिप्पणी के बाद:

15.3.2.12 Customizing WebDataBinder initialization पर एक नज़र डालें।

@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

धन्यवाद, जब _not_ एक JSON पेलोड, बल्कि एक सामान्य पोस्ट फ़ॉर्म प्रविष्टि जमा करने कि मैं क्या मतलब था यह संभव है: आप एक @InitBinder विधि है कि एक संपादक एक अनुरोध पैरामीटर के आधार पर पंजीकृत करता है इस्तेमाल कर सकते हैं। –

+0

@Deejay ठीक है मेरे उत्तर –

+0

हाय, मैं एक समान समस्या को हल करने का प्रयास करता हूं, लेकिन बिना परिणाम के .. यह मेरा प्रश्न है: http://stackoverflow.com/questions/21550238/how-instantiate-a-concrete-class- इन-इनिट-बाइंडर क्या आप मेरी मदद कर सकते हैं ?? – Teo