Java SpringMVC:如何在进入控制器之前修改拦截器中的@Pathvariable(URI)?

Java SpringMVC:如何在进入控制器之前修改拦截器中的@Pathvariable(URI)?,java,spring,spring-mvc,interceptor,jdk6,Java,Spring,Spring Mvc,Interceptor,Jdk6,我在前置处理器拦截器中获取控制器的@PathVariable Map<String, String> pathVariable = (Map<String, String>) request.getAttribute( HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE ); Map pathVariable=(Map)request.getAttribute(HandlerMapping.URI\u TEMPLATE\u V

我在前置处理器拦截器中获取控制器的@PathVariable

Map<String, String> pathVariable = (Map<String, String>) request.getAttribute( HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE );
Map pathVariable=(Map)request.getAttribute(HandlerMapping.URI\u TEMPLATE\u VARIABLES\u ATTRIBUTE);
但我希望修改@PathVariable值(如下)

@RequestMapping(value=“{uuid}/attributes”,method=RequestMethod.POST)
public ResponseEntity addAttribute(@PathVariable(“uuid”)字符串uuid,HttpServletRequest请求,HttpServletResponse响应){
//逻辑
}
如何在进入控制器之前修改拦截器中的@PathVariable(“uuid”)值?? 我正在使用Spring4.1和JDK1.6。我无法升级它的

尝试下面给定的代码

public class UrlOverriderInterceptor implements ClientHttpRequestInterceptor {

private final String urlBase;

public UrlOverriderInterceptor(String urlBase) {
    this.urlBase = urlBase;
}

private static Logger LOGGER = AppLoggerFactory.getLogger(UrlOverriderInterceptor.class);

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    URI uri = request.getURI();
    LOGGER.warn("overriding {0}", uri);

    return execution.execute(new MyHttpRequestWrapper(request), body);

}

private class MyHttpRequestWrapper extends HttpRequestWrapper {
    public MyHttpRequestWrapper(HttpRequest request) {
        super(request);
    }

    @Override
    public URI getURI() {
        try {
            return new URI(UrlUtils.composeUrl(urlBase, super.getURI().toString())); //change accordingly 
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}

}拦截器的一般用途是将通用功能应用于控制器。例如,所有页面上显示的默认数据、安全性等。您希望将其用于通常不应使用的单个功能

使用拦截器无法实现您想要实现的目标。首先,根据映射数据检测要执行的方法。在执行该方法之前,将执行拦截器。在这种情况下,您基本上希望更改传入的请求并执行不同的方法。但该方法已被选中,因此无法工作

当您最终想要调用相同的方法时,只需添加另一个请求处理方法,该方法要么最终调用
addAttribute
,要么简单地用UUID重定向到URL

@RequestMapping("<your-url>")
public ResponseEntity<?> addAttributeAlternate(@RequestParam("secret") String secret, HttpServletRequest request, HttpServletResponse response) {

    String uuid = // determine UUID based on request
    return this.addAttribute(uuid,request,response);
}
@RequestMapping(“”)
public ResponseEntity addAttributeAlternate(@RequestParam(“secret”)字符串secret,HttpServletRequest,HttpServletResponse){
字符串uuid=//根据请求确定uuid
返回此.addAttribute(uuid、请求、响应);
}

为什么?变量是URL的一部分,为什么要更改它。一般来说,你不应该做这样的事情。我有两种方法来访问资源。首先使用UUID进行访问(请参见上面给出的代码),最后一种方法是一些可以识别UUID的URI。所以我希望使用最后的方法修改URI(一些URI到UUID)。然后,控制器不需要修改。不要。。。请不要这样做,因为这将是复杂和繁琐的。只需向控制器添加一个方法,该方法正好执行此操作并重定向到路径URL,或者只需使用UUID调用另一个方法。这两种方法都比试图将其放入拦截器更简单。是的,控制器中的其他方法可以将一些URI修改为UUID。我将添加方法。正如你所说。谢谢Sir UrlUtils是自定义类,您可以使用自己的字符串操作UTIL/代码
@RequestMapping("<your-url>")
public ResponseEntity<?> addAttributeAlternate(@RequestParam("secret") String secret, HttpServletRequest request, HttpServletResponse response) {

    String uuid = // determine UUID based on request
    return this.addAttribute(uuid,request,response);
}