2013-05-16 47 views
1

假設我有類:Spring MVC的抽象類結合

abstract class Animal {} 

class Elephant extends Animal { 
    Trunk trunk; 
    RightEar rightEar; 
} 

class Peacock extends Animal { 
    Tail tail; 
    Beak beak; 
} 

我想寫單控制器的方法,這將有Animal類型的參數:

@RequestMapping("/animal") 
public ModelAndView animalsHandler(@ModelAttribute("animal") Animal animal) {...} 

我發現,對於非通過選擇合適的propertyEditor中的@InitBinder方法,即它只會通過不同的方式轉換輸入字符串,它的參數是could be done

但是如果ElephantPeacock裏面有一些其他的對象呢?似乎我不能寫propertyEditor s在那種情況下,但只爲他們Trunk,TailBeak?..我完全困惑。

回答

1

requestmapper能夠創建正確的實例來填充requestparameters是很重要的。一旦完成,beanwrapper將能夠處理具有默認行爲的屬性。所以你需要能夠爲動物modelattribute創建一個孔雀實例,你應該沒問題。

這是多麼我已經做到了:(我這樣做是爲了解決實體)

  • 在啓動時掃描實體,創造拿着地圖simpleclassname和階級的

  • 創建一個組件StringToEntityConverter使用上述組件解析字符串並將其註冊到ConversionService(SimpleClassName_Identifier)

  • 發送請求參數,如下所示:SimpleClassName_Identifier

如果這樣做是正確的,轉換器將踢入如果requestparameter是一個實體並將其轉換。

因爲o已經爲具有所有公共基類和ID爲整數的實體做了這些操作,所以掃描非常簡單。轉換器接受字符串,將其拆分並使用實體管理器在id不爲空時獲取實體,或者如果id爲null,則創建新實例。 從這一點開始,所有的請求映射都可以直接將實體實例作爲請求參數。

simpleclassname在這裏工作,因爲無論如何,所有jpa實體都需要一個唯一的簡單名稱!

如果您不想讓名稱與組件類映射的組件也可以發送完整的類名稱。如果你只需要新的實例,轉換器只需要類名而不需要其他任何東西。

+0

謝謝你的回答!我試圖按照你的指示,爲我的實體編寫特殊的轉換器,並將它註冊到'conversionService'中。但是當我發送請求時,有'BeanInstantiationException',它問我'是一個抽象類嗎?'。所以我必須編寫'HandlerMethodArgumentResolver'的自定義實現,我選擇一個合適的子類,然後使用'WebRequestDataBinder'手動綁定所有字段。 – Patison