[ https://issues.apache.org/jira/browse/CXF-2390?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sergey Beryozkin updated CXF-2390: ---------------------------------- Component/s: REST > Enums using fromString() but jaxb creates fromValue() > ----------------------------------------------------- > > Key: CXF-2390 > URL: https://issues.apache.org/jira/browse/CXF-2390 > Project: CXF > Issue Type: Bug > Components: REST > Affects Versions: 2.2.2 > Environment: CXF version 2.2.2 > Jaxb version 2.1.9 ? Not positive on this > Reporter: David Wood > > Let's say you have an xsd file that defines an enum. > <xs:simpleType name="timezone"> > <xs:restriction base="xs:string"> > <xs:enumeration value="Europe/London" /> > <xs:enumeration value="America/New_York" /> > </xs:restriction> > </xs:simpleType> > When xjc (jaxb) runs and creates a Java enum for this, it gives the Enum > instances slightly different names, but makes the underlying value available. > @XmlType(name = "timezone") > @XmlEnum > public enum Timezone { > @XmlEnumValue("Europe/London") > EUROPE_LONDON("Europe/London"), > @XmlEnumValue("America/New_York") > AMERICA_NEW_YORK("America/New_York"), > It also creates a "fromValue()" method to retrieve an enum instance given the > value. > Now say that you want to create a REST web service that has a Timezone as a > QueryParam > @GET > @Path("/test") > public Result theTest(@QueryParam("timezone") Timezone timezone) > If you attempt to call this REST method with a timezone of "Europe%2FLondon", > you'll get an exception > javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException: No > enum const class beans.Timezone.Europe/London > at > org.apache.cxf.jaxrs.utils.InjectionUtils.evaluateFactoryMethod(InjectionUtils.java:332) > at > org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:284) > at > org.apache.cxf.jaxrs.utils.InjectionUtils.createParameterObject(InjectionUtils.java:649) > at > org.apache.cxf.jaxrs.utils.JAXRSUtils.readQueryString(JAXRSUtils.java:763) > The InjectionUtils class has this logic: > // check for valueOf(String) static methods > String[] methodNames = pClass.isEnum() > ? new String[] {"fromString", "valueOf"} > : new String[] {"valueOf", "fromString"}; > Object result = evaluateFactoryMethod(value, pClass, pType, > methodNames[0]); > if (result == null) { > result = evaluateFactoryMethod(value, pClass, pType, > methodNames[1]); > } > Note that in the case of an Enum, it is trying to call "fromString()" (which > doesn't exist), and failing that, it tries to call "valueOf()", which would > work if the client had passed EUROPE_LONDON as the value. > Perhaps different versions of xjc/jaxb create fromValue and some create > fromString(). I'm not sure. But clearly some versions of jaxb create a > method called fromValue(). > The net result is that the service doesn't actually work if you pass it the > value as defined in the restriction. Can injection utils be changed to > include an attempt to use fromValue() as well? -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.