Хорошо, вот как я это сделал.
Поскольку мы не можем наследовать аннотации и, следовательно, цель @PathVariable
- это только параметры, мы должны создать новую аннотацию, как показано ниже:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface PathVariablePad {
int zeros() default 0;
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
}
Теперь нам нужно создать HandlerMethodArgumentResolver
. В этом случае, поскольку все, что я хочу, это добавить @PathVariable
влево с нулями, мы собираемся унаследовать PathVariableMethodArgumentResolver
, например:
public class PathVariablePadderMethodArgumentResolver extends PathVariableMethodArgumentResolver {
private String leftPadWithZeros(Object target, int zeros) {
return String.format("%1$" + zeros + "s", target.toString()).replace(' ', '0'); // Eeeewwwwwwwwwwww!
}
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(PathVariablePad.class);
}
@Override
protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {
PathVariablePad pvp = parameter.getParameterAnnotation(PathVariablePad.class);
return new NamedValueInfo(pvp.name(), pvp.required(), leftPadWithZeros("", pvp.zeros()));
}
@Override
protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception {
PathVariablePad pvp = parameter.getParameterAnnotation(PathVariablePad.class);
return leftPadWithZeros(super.resolveName(name, parameter, request), pvp.zeros());
}
}
Наконец, давайте зарегистрируем наш преобразователь аргументов метода (xml):
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="my.package.PathVariablePadderMethodArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
Использование довольно простое, и вот как это сделать:
@GetMapping("/ten/{id}")
public void ten(@PathVariablePad(zeros = 10) String id) {
// id would be "0000000001" on "/ten/1" calls
}
@GetMapping("/five/{id}")
public void five(@PathVariablePad(zeros = 5) String id) {
// id would be "00001" on "/five/1" calls
}
person
Henri
schedule
21.12.2017
id = leftPad(id)
? - person JB Nizet   schedule 21.12.2017