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)

Reply via email to