A ParamConverterProvider would be needed to support domain-primitives as path parameter.
The solution should be quite similar to a Spring-Coverter.
Generated Code might look like this
@Provider
public class LazyvalParamConverterProvider implements ParamConverterProvider {
@SuppressWarnings("unchecked")
@Override
public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
if (rawType == Isbn.class) return (ParamConverter<T>) new IsbnParamConverter();
if (rawType == Quantity.class) return (ParamConverter<T>) new QuantityParamConverter();
return null;
}
static class IsbnParamConverter implements ParamConverter<Isbn> {
@Override
public Isbn fromString(String value) {
if (value == null) return null;
return Isbn.parse(value); // uses objectCreation()
}
@Override
public String toString(Isbn value) {
if (value == null) return null;
return String.valueOf(value.value()); // uses accessor()
}
}
static class QuantityParamConverter implements ParamConverter<Quantity> {
@Override
public Quantity fromString(String value) {
if (value == null) return null;
return new Quantity(Integer.parseInt(value));
}
@Override
public String toString(Quantity value) {
if (value == null) return null;
return String.valueOf(value.value());
}
}
}
Mapping logic for types needed to call correct methods
private static final Map<String, String> STRING_PARSE_MAP = Map.ofEntries(
Map.entry("java.lang.String", "%s"),
Map.entry("int", "Integer.parseInt(%s)"),
Map.entry("java.lang.Integer", "Integer.parseInt(%s)"),
Map.entry("long", "Long.parseLong(%s)"),
Map.entry("java.lang.Long", "Long.parseLong(%s)"),
Map.entry("double", "Double.parseDouble(%s)"),
Map.entry("java.lang.Double", "Double.parseDouble(%s)"),
// etc.
);
A
ParamConverterProviderwould be needed to support domain-primitives as path parameter.The solution should be quite similar to a Spring-Coverter.
Generated Code might look like this
Mapping logic for types needed to call correct methods