Andrei Shakirin created CXF-5722:
------------------------------------
Summary: JAXB generated Enum throws IllegalArgumentException by
unmarshalling as @QueryParam
Key: CXF-5722
URL: https://issues.apache.org/jira/browse/CXF-5722
Project: CXF
Issue Type: Bug
Components: JAX-RS
Affects Versions: 3.0.0-milestone2
Reporter: Andrei Shakirin
Assignee: Andrei Shakirin
By processing request with Query parameter, InjectionUtils tries to recognize
and instantiate parameter class.
In case of Enum parameter class, InjectionUtils.handleParameter() method calls
in loop following methods: "fromString", "fromValue", "valueOf" using
reflection. If method returns null, it tries the next one:
if (result == null) {
// check for valueOf(String) static methods
String[] methodNames = cls.isEnum()
? new String[] {"fromString", "fromValue", "valueOf"}
: new String[] {"valueOf", "fromString"};
for (String mName : methodNames) {
result = evaluateFactoryMethod(value, cls, pType, mName);
if (result != null) {
break;
}
}
The problem is that JAXB generated Enum doesn't returns null, but throws
IllegalArgumentException in fromValue() if argument is in wrong case.
As a result following method throws IllegalArgumentException:
@GET
@Path("/enum/")
Response checkEnum(@QueryParam("car") CarType car);
for generated bean:
@XmlRootElement(name = "Car")
@XmlType(name = "carType")
@XmlEnum
public enum CarType {
@XmlEnumValue("Audi")
AUDI("Audi"),
@XmlEnumValue("Golf")
GOLF("Golf"),
BMW("BMW");
private final String value;
CarType(String v) {
value = v;
}
public String value() {
return value;
}
public static CarType fromValue(String v) {
for (CarType c: CarType.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}
--
This message was sent by Atlassian JIRA
(v6.2#6252)