2012-04-02 136 views
1

我正在嘗試使用Grails中構建的應用程序,但我遇到了一個我不明白的錯誤。基本上,我有一個枚舉:Grails:java.lang.IllegalArgumentException:沒有枚舉常量

package com.wbr.manning.common 
public enum ChapterType { 
    CHAPTER("chapter"), PREFACE("preface"), APPENDIX("appendix"), PART("part") 
    ChapterType(String value) { this.value = value } 
    String value 
    String getKey() { name() } 
    String toString() { value } 
} 

但是,當我嘗試列出章節的對象,我得到:

java.lang.IllegalArgumentException: No enum const class com.wbr.manning.common.ChapterType.part 
    at java.lang.Enum.valueOf(Enum.java:196) 
    at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1163) 
    at com.wbr.manning.agileAuthor.AAChapterController$_closure3.doCall(AAChapterController.groovy:39) 
    at com.wbr.manning.agileAuthor.AAChapterController$_closure3.doCall(AAChapterController.groovy) 
    at java.lang.Thread.run(Thread.java:662) 
2012-04-02 09:55:23,401 [http-8080-1] ERROR common.ErrorsController - org.codehaus.groovy.grails.web.errors.GrailsWrappedRuntimeException: No enum const class com.wbr.manning.common.ChapterType.part

上,我做錯了什麼在這裏的任何想法?我是否擁有正確的枚舉,還是需要查看調用代碼?

謝謝!

回答

2

如果您要根據它的值來查找枚舉,你需要一個靜態方法添加到您的枚舉像這樣:

static ChapterType fromString(type) { 
    ChapterType.values().find { it.value == type } 
} 

你可以再做:

ChapterType c = ChapterType.fromString('part') 
+0

很高興知道,謝謝!我通過更改數據庫中的值來解決問題,但這當然更優雅! – NickChase 2012-04-02 17:29:09

+0

在大多數實現中,這個方法的名字是'getInstance' – mre 2012-04-02 17:48:56

3

No enum const class com.wbr.manning.common.ChapterType.part

應該是ChapterType.PART。你的必須尊重區分大小寫。

+0

啊!我混淆了這兩個價值觀。非常感謝!!! – NickChase 2012-04-02 14:49:22

1

問題出在您的調用代碼中。對AAChapterController.groovy 39線條件查詢正在修建調用

ChapterType.valueOf("part") 

但應該調用

ChapterType.valueOf("PART") 

如果你不能看到文字串"part"這裏,尋找一個字符串變量和呼叫.toUpperCase()

+0

原來它取決於數據庫中的內容。謝謝! – NickChase 2012-04-02 17:29:36