[jbossseam-issues] [JBoss JIRA] Created: (JBSEAM-4169) Enum converter does not handle inner anonymous enums

Adam Michalik (JIRA) jira-events at lists.jboss.org
Mon May 11 04:24:46 EDT 2009


Enum converter does not handle inner anonymous enums
----------------------------------------------------

                 Key: JBSEAM-4169
                 URL: https://jira.jboss.org/jira/browse/JBSEAM-4169
             Project: Seam
          Issue Type: Bug
    Affects Versions: 2.1.1.GA
         Environment: JBoss 5.0.1.GA, JDK 6u13, Seam 2.1.1.GA
            Reporter: Adam Michalik


The XHTML:

<h:selectManyListbox value="#{testBean.tests}">
	<s:selectItems value="#{testLister.tests}" noSelectionLabel="" var="test" label="#{test}"/>
	<s:convertEnum/>
</h:selectManyListbox>

testLister returns a Set<Test>, testBean.set/getTests operates on List<Test>.

The Test enum:

package test;
public enum Test {
	TEST,
	TEST_ANON {
		
	};
}

Enum converter fails with:
java.lang.IllegalArgumentException with message: "test.Test$1 is not an enum type"

java.lang.Class.enumConstantDirectory(Class.java:2965)
java.lang.Enum.valueOf(Enum.java:191)
org.jboss.seam.ui.converter.EnumConverter.getAsObject(EnumConverter.java:44)
org.jboss.seam.ui.converter.PrioritizableConverter.getAsObject(PrioritizableConverter.java:61)
org.jboss.seam.ui.converter.ConverterChain.getAsObject(ConverterChain.java:110)

This is caused by the converter code:

else if (val instanceof Collection) {
	t = ((Collection) val).iterator().next().getClass();
	return Enum.valueOf(t, value);
}

When t is an anonymous inner enum, the Enum.valueOf cannot be invoked properly.
Cf.:

package test;

public enum Test {
	TEST,
	TEST_ANON {
		
	};
	
	
	public static void main(String[] args) {
		System.out.println(Test.TEST.getClass());  // prints "class test.Test"
		Class c1 = Test.TEST.getClass();
		System.out.println(Enum.valueOf(c1, "TEST")); // prints "TEST"
		System.out.println(Test.TEST_ANON.getClass()); // prints "class test.Test$1"
		Class c2 = Test.TEST_ANON.getClass();
		System.out.println(Enum.valueOf(c2, "TEST_ANON"));  // java.lang.IllegalArgumentException: test.Test$1 is not an enum type
	} 
	
}

Solution would be to use Enum's getDeclaringClass().

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the seam-issues mailing list