簡體   English   中英

可以按名稱對枚舉進行數據綁定嗎?

[英]Is it possible databinding of enums by name in grails?

我在grails中搜索了按名稱枚舉數據綁定的示例,但沒有找到任何示例。 我想在請求中傳遞枚舉名稱,並將枚舉綁定為操作的參數。 我需要自動綁定,即無需顯式調用Enum.valueOf(params.val)綁定。

可以按名稱自動枚舉枚舉中的枚舉嗎? 如果是,我該如何實現? 我正在使用grails 2.5.1

我使用的是2.4.5,所以也許有些更改,但是這不可能直接發生,因為無法使用反射實例化枚舉,這就是幕后發生的事情。

ControllersApiinitializeCommandObject方法中,將檢查綁定類是否為域類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')

我找到了答案:

控制器動作的數據綁定僅支持兩種類別:基本類型(基元)和命令對象,因此默認情況下不支持枚舉。

從Grails 2.5.1文檔:

控制器操作參數受請求參數數據綁定的約束。 控制器動作參數有2類。 第一類是命令對象。 復雜類型被視為命令對象。 有關詳細信息,請參見用戶指南的“命令對象”部分。 另一類是基本對象類型。 支持的類型是8個原語,它們對應的類型包裝器和java.lang.String。

為了支持grails中的枚舉(默認名稱)的數據綁定,您必須在command對象中使用枚舉。

對的,這是可能的。 如果我沒記錯的話,訣竅是為枚舉定義一個構造函數,該構造函數將代碼作為屬性並創建相應的枚舉。

現在,將動作參數的數據類型指定為枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM