จากคำตอบที่ยอดเยี่ยมของ Fabien ครูบาฉันคิดว่ามันจะดีถ้า**
ส่วนของ URL สามารถกำหนดเป็นพารามิเตอร์ให้กับวิธีการควบคุมผ่านคำอธิบายประกอบในลักษณะที่คล้ายกับ@RequestParam
และ@PathVariable
แทนที่จะใช้วิธียูทิลิตี้เสมอไป ซึ่งต้องการไฟล์HttpServletRequest
. ดังนั้นนี่คือตัวอย่างของวิธีการนำไปใช้ หวังว่าจะมีคนพบว่ามีประโยชน์
สร้างคำอธิบายประกอบพร้อมกับตัวแก้ไขอาร์กิวเมนต์:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WildcardParam {
class Resolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterAnnotation(WildcardParam.class) != null;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
return request == null ? null : new AntPathMatcher().extractPathWithinPattern(
(String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE),
(String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE));
}
}
}
ลงทะเบียนตัวแก้ไขอาร์กิวเมนต์วิธีการ:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new WildcardParam.Resolver());
}
}
ใช้คำอธิบายประกอบในวิธีการจัดการคอนโทรลเลอร์ของคุณเพื่อให้เข้าถึง**
ส่วนของ URL ได้อย่างง่ายดาย:
@RestController
public class SomeController {
@GetMapping("/**")
public void someHandlerMethod(@WildcardParam String wildcardParam) {
}
}