Spring MVC @PathVariable выдает ошибку 404

Я искал ответ, и многие ответы не решили мою проблему, хотя они решили очень похожие проблемы.

Поэтому моя проблема заключается в следующем: у меня есть переменная пути, которая может содержать символ "/". Это же значение также содержит другие специальные символы, такие как "." "+" "=" и т. д. в основном все действительные символы Base64.

Но Spring MVC выдает 404 с журналами, говорящими, что обработчик не найден. Я пытался использовать регулярные выражения в переменной пути, но безрезультатно. поэтому ниже id мои фрагменты кода:

http://localhost:8080/sale/public/viewSaleDetails/b91a03730a746a2b27e1c7bbbd94ddf6a9df593301cd96c606348df5eed235da.FkJJbOqEM8Xvhffe6FwUdQ8/mMCD4+fxpY7w5L9kbJ8=

мой URL Если вы видите, это имеет / в значение переменной пути. вместе с "." и "+" и "=". Spring отображает это правильно, если я удаляю / между символами "m" и "8". но с / в значении это просто не работает. Я пробовал много вещей, включая фильтр кодировки символов, регулярное выражение в pathvariable и т. Д. Пожалуйста, помогите.

Также я не хочу использовать параметры запроса, насколько это возможно.

@RequestMapping(value = "/public/viewSaleDetails/{id}", method = RequestMethod.GET)

это мое отображение Кроме того, URL-адрес удаляется из браузера, так как он без какой-либо кодировки URL. Я отслеживал это на панели сети браузера, и это не кодирует это как ожидалось. Я использую версию Spring 4.2.8 RELEASE с Java 8 и Tomcat 8

1 ответ

Весной Джира остается открытым вопросом в соответствии с косыми чертами в пути. И из-за обсуждения не имеет смысла менять стратегию на базовом уровне. Проблема была создана из-за этой публикации в стеке, и я предлагаю создать преобразователь значений в соответствии с ответом.

Вот пример кода для такого преобразователя:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;

@SpringBootApplication
public class SampleSpringApp {
    public static void main(String[] args) {
        SpringApplication.run(SampleSpringApp.class, args);
    }
}

@RestController
class SampleController {
    @RequestMapping("/records/**")
    public String getId(Id id) {
        return id.id;
    }
}

@Configuration
@EnableWebMvc
class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new IdResolver());
    }
}

class IdResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return Id.class.isAssignableFrom(parameter.getParameterType());
    }

    @Override
    public Object resolveArgument(MethodParameter parameter,
                                  ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest,
                                  WebDataBinderFactory binderFactory) throws Exception {    
        String basePath = ((String) webRequest.getAttribute(
                HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE,
                RequestAttributes.SCOPE_REQUEST
        )).replace("**", "");
        String id = ((String) webRequest.getAttribute(
                HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE,
                RequestAttributes.SCOPE_REQUEST
        )).replace(basePath, "");
        return new Id(id);
    }
}

class Id {
    public final String id;

    Id(String id) {
        this.id = id;
    }
}
Другие вопросы по тегам