2012-04-02 9 views
1

Ich versuche, mit einer App zu arbeiten, die in Grails erstellt wurde, aber ich bekomme einen Fehler, den ich nicht verstehe. Im Grunde habe ich eine ENUM bekam:Grails: java.lang.IllegalArgumentException: Nein enum const

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 } 
} 

Aber wenn ich versuche, die Kapitel Objekte aufzulisten, die ich erhalten:

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

Alle Ideen, was ich falsch hier? Habe ich das Enum korrekt, oder muss ich auf den Anrufcode schauen?

Danke!

Antwort

2

Wenn Sie die Enum basierend auf seinen Wert suchen möchten, müssen Sie wie so eine statische Methode zu Ihrem Enum hinzuzufügen:

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

Anschließend können Sie tun:

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

Gut zu wissen, danke! Ich löste das Problem, indem ich die Werte in der Datenbank änderte, aber das ist sicherlich eleganter! – NickChase

+0

In den meisten Implementierungen lautet der Name dieser Methode "getInstance" – mre

3

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

Sollte ChapterType.PART sein. Sie müssen Groß-und Kleinschreibung beachten.

+0

AH! Ich habe die zwei Werte verwechselt. Ich danke dir sehr!!! – NickChase

1

Das Problem liegt in Ihrem Anrufcode. In Zeile 39 von AAChapterController.groovy eine Kriterien-Abfrage erstellt wird, die

ChapterType.valueOf("part") 

nennt Aber es sollte

ChapterType.valueOf("PART") 

rufen Wenn Sie die Zeichenkette "part" hier sehen können, suchen Sie nach einem String-Variable und Call .toUpperCase() auf sie

+0

Es stellte sich heraus, was in der Datenbank war. Vielen Dank! – NickChase