Skip to content

Instantly share code, notes, and snippets.

@jamezp
Created January 26, 2022 01:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jamezp/aad75e83760f565f15f4f0b54e202620 to your computer and use it in GitHub Desktop.
Save jamezp/aad75e83760f565f15f4f0b54e202620 to your computer and use it in GitHub Desktop.
package dev.resteasy.example;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
/**
* @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a>
*/
@Provider
public class EnumParamConverterProvider implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(final Class<T> rawType, final Type genericType, final Annotation[] annotations) {
if (!rawType.isEnum()) {
return null;
}
final Enum<?>[] constants = (Enum<?>[]) rawType.getEnumConstants();
return new ParamConverter<T>() {
@Override
@SuppressWarnings("unchecked")
public T fromString(final String value) {
if (value == null || value.isEmpty()) {
return null;
}
for (Enum<?> e : constants) {
if (e.name().equalsIgnoreCase(value)) {
return (T) e;
}
}
// No match, check toString()
for (Enum<?> e : constants) {
if (e.toString().equalsIgnoreCase(value)) {
return (T) e;
}
}
try {
final int ordinal = Integer.parseInt(value) - 1;
if (ordinal >= 0 && constants.length >= ordinal) {
return (T) constants[ordinal];
}
} catch (NumberFormatException ignore) {
}
throw new WebApplicationException(Response.status(Response.Status.BAD_REQUEST)
.entity(String.format("Failed to find constant '%s'", value))
.build());
}
@Override
public String toString(final T value) {
return value != null ? value.toString() : null;
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment