Skip to content

Generator: JAX-RS #72

Description

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.
);

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions