我如何调节@PathVariable?

时间:2017-11-08 07:39:12

标签: spring spring-mvc

我有以下方法。

public ResponseEntity some(@PathVariable("id") final String id_) {
    final Long id = ((Supplier<Long>) () -> {
        try {
            if (id_ == null || id_.equals("dontcare")) {
                return null;
            }
            return Long.parseLong(id_);
        } catch (final NumberFormatException nfe) {
            throw new RuntimeException(nfe);
        }
    }).get();
}

您可以假设我想要参数值\d+dontcare

我如何或可以使用什么来做以下事情?

public ResponseEntity some(
    @Dontcare @PathVariable("id") final Long id) {
}

我找到了WebArgumentHandlerHandlerMethodArgumentResolverPathVariableMethodArgumentResolver,但我找不到任何好的例子。

请帮帮我。

更新

我准备了以下课程。

public class DontcarePathVariableResolver
    extends PathVariableMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        final boolean flag = parameter.getMethodAnnotation(
            DontcarePathVariable.class) != null;
        logger.info("flag: {}", flag);
        return flag;
    }

    @Override
    protected Object resolveName(String name, MethodParameter parameter,
                                 NativeWebRequest request)
            throws Exception {
        @SuppressWarnings({"unchecked"})
        final Map<String, String> templateVariables
                = (Map<String, String>) request.getAttribute(
                HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
                RequestAttributes.SCOPE_REQUEST);
        final String pathValue = templateVariables.get(name);
        return new DontcareConverter().convert(pathValue);
    }
}

并添加了它。

@Configuration 公共类WebMvcConfiguration扩展了WebMvcConfigurerAdapter {

@Override
public void addArgumentResolvers(final List<HandlerMethodArgumentResolver> resolvers) {
    resolvers.add(new DontcarePathVariableMethodArgumentResolver());
    logger.info("resolver added");
    //super.addArgumentResolvers(resolvers);
}

}

但确实发挥了作用。

我认为Long类型的默认处理程序已在使用中。

0 个答案:

没有答案