package com.nicusa.converter; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.convert.converter.Converter; import org.springframework.hateoas.ResourceSupport; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.util.UriTemplate; public abstract class ResourceToDomainConverter<T, D> implements Converter<T, D> { protected Long extractIdFromLink(Class controllerClass, ResourceSupport resource, String methodName, Class... args) { return Long.valueOf(extractFieldFromLink(controllerClass, resource, "self", methodName, "id", args)); } protected String extractFieldFromLink(Class controllerClass, ResourceSupport resource, String relation, String methodName, String fieldName, Class... args) { UriTemplate uriTemplate = findUriTemplate(controllerClass, methodName, args); return uriTemplate.match(resource.getLink(relation).getHref()).get(fieldName); } protected UriTemplate findUriTemplate(Class controllerClass, String methodName, Class... argumentClasses) { RequestMapping requestMapping = findRequestMapping(controllerClass, methodName, argumentClasses); return new UriTemplate(requestMapping.value()[0]); } protected RequestMapping findRequestMapping(Class<?> controller, String methodName, Class<?>... arguments) { RequestMapping requestMapping; try { requestMapping = AnnotationUtils.getAnnotation( controller.getMethod(methodName, arguments), RequestMapping.class); } catch (NoSuchMethodException | SecurityException e) { throw new RuntimeException(e); } return requestMapping; } }