Spring MVC: Как изменить @Pathvariable (URI) в Interceptor перед переходом в контроллер? - PullRequest
0 голосов
/ 18 марта 2019

Я получил @PathVariable контроллера в Pre-Handler Interceptor.

Map<String, String> pathVariable = (Map<String, String>) request.getAttribute( HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE );

Но я хочу изменить значение @PathVariable (ниже).

@RequestMapping(value = "{uuid}/attributes", method = RequestMethod.POST)
public ResponseEntity<?> addAttribute(@PathVariable("uuid") String uuid, HttpServletRequest request, HttpServletResponse response) {

 //LOGIC
}

Как сделатьизменить значение @PathVariable ("uuid") в перехватчике перед переходом в контроллер ?? Я использую Spring 4.1 и JDK 1.6.Я не могу обновить его.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Общее использование перехватчиков - применение универсальных функций к контроллерам. То есть данные по умолчанию, показанные на всех страницах, безопасность и т. д. Вы хотите использовать их для единой функциональности, которую вы вообще не должны делать.

То, что вы пытаетесь достичь, невозможно с помощью перехватчика. Сначала определяется способ выполнения на основе данных отображения. Перед выполнением метода выполняется перехватчик. В этом вы в основном хотите изменить входящий запрос и выполнить другой метод. Но метод уже выбран, поэтому он не будет работать.

Поскольку вы в конечном итоге захотите вызвать тот же метод, просто добавьте другой метод обработки запросов, который либо в итоге вызовет addAttribute, либо просто перенаправит на URL с UUID.

@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);
}
0 голосов
/ 18 марта 2019

Попробуйте ниже приведенный код.

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);
        }
    }
}

}

...