[英]Is it possible databinding of enums by name in grails?
我在grails中搜索了按名稱枚舉數據綁定的示例,但沒有找到任何示例。 我想在請求中傳遞枚舉名稱,並將枚舉綁定為操作的參數。 我需要自動綁定,即無需顯式調用Enum.valueOf(params.val)
綁定。
可以按名稱自動枚舉枚舉中的枚舉嗎? 如果是,我該如何實現? 我正在使用grails 2.5.1
我使用的是2.4.5,所以也許有些更改,但是這不可能直接發生,因為無法使用反射實例化枚舉,這就是幕后發生的事情。
在ControllersApi
的initializeCommandObject
方法中,將檢查綁定類是否為域類isDomainClass
,並且失敗。
相同的方法嘗試在類型上使用newInstance()
:
} else if (requestMethod == HttpMethod.POST || !isDomainClass) {
commandObjectInstance = type.newInstance();
}
引發InstantiationException
,將其捕獲並再次拋出。 有趣的是,在引發異常之前,它會在控制器中尋找匹配的異常處理方法。
def instantiationException(final InstantiationException exception) {
render "I've been caught"
}
這將“成功”執行,但在這種情況下價值不高。
也許您可以嘗試使用BindUsing注解,例如
@BindUsing({ quarter, source ->
Enum.valueOf(source['val'])
})
Enum val
http://mrhaki.blogspot.in/2015/04/grails-goodness-custom-data-binding.html
如果您的普通枚舉如下所示:
enum SomeEnum {
ONE, TWO, THREE
}
以及具有相應屬性的類:
class SomeDomain {
SomeEnum someEnum
}
綁定器可以將String
綁定到someEnum
屬性,並為您進行轉換...
new SomeDomain(someEnum: 'ONE')
我找到了答案:
控制器動作的數據綁定僅支持兩種類別:基本類型(基元)和命令對象,因此默認情況下不支持枚舉。
控制器操作參數受請求參數數據綁定的約束。 控制器動作參數有2類。 第一類是命令對象。 復雜類型被視為命令對象。 有關詳細信息,請參見用戶指南的“命令對象”部分。 另一類是基本對象類型。 支持的類型是8個原語,它們對應的類型包裝器和java.lang.String。
為了支持grails中的枚舉(默認名稱)的數據綁定,您必須在command對象中使用枚舉。
對的,這是可能的。 如果我沒記錯的話,訣竅是為枚舉定義一個構造函數,該構造函數將代碼作為屬性並創建相應的枚舉。
現在,將動作參數的數據類型指定為枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.