[
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.