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

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

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

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

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

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

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

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

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


person Shailesh Vaishampayan    schedule 01.02.2017    source источник
comment
я не уверен, что Spring может обрабатывать / в PathVariables, я думаю, что это не сработает, однако вы можете использовать какой-нибудь переписчик URL-адресов, чтобы преобразовать PathVariable из public/viewSaleDetails/{id} в RequestParam public/viewSaleDetails?id= xx до достижения вашего контроллера.   -  person Mouad EL Fakir    schedule 02.02.2017


Ответы (1)


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

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

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;
    }
}
person Yevhenii Melnyk    schedule 02.02.2017