gpt4 book ai didi

java - Spring MVC : How to read and change a @PathVariable value

转载 作者:行者123 更新时间:2023-11-29 04:22:59 24 4
gpt4 key购买 nike

这个问题与this非常相似一个,但我不知道从哪里开始。

假设我有这样一个 Action :

@GetMapping("/foo/{id}")
public Collection<Foo> listById(@PathVariable("id") string id) {
return null;
}

如何拦截 listById 方法并更改 id 的值(例如:连接字符串、用零填充等)?

我的情况是大部分 ID 都用零填充左侧(长度不同),我不想将其留给我的 ajax 调用。

预期的解决方案:

@GetMapping("/foo/{id}")
public Collection<Foo> listById(@PathVariablePad("id", 4) string id) {
// id would be "0004" on "/foo/4" calls
return null;
}

最佳答案

好的,这就是我的做法。

由于我们不能继承注解,因此@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
}

关于java - Spring MVC : How to read and change a @PathVariable value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com