Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring MVC@PathVariable给出404错误_Spring_Spring Mvc_Character Encoding_Path Variables - Fatal编程技术网

Spring MVC@PathVariable给出404错误

Spring MVC@PathVariable给出404错误,spring,spring-mvc,character-encoding,path-variables,Spring,Spring Mvc,Character Encoding,Path Variables,我一直在寻找答案,许多答案并没有解决我的问题,尽管它们解决了非常相似的问题 所以我的问题是:我有一个路径变量,它可能包含字符“/”。相同的值还包含其他特殊字符,如“+”等。基本上所有有效的Base64字符 但是SpringMVC抛出404,日志显示找不到处理程序。我也尝试在path变量中使用正则表达式,但没有效果。下面是我的代码片段: http://localhost:8080/sale/public/viewSaleDetails/b91a03730a746a2b27e1c7bbbd94ddf

我一直在寻找答案,许多答案并没有解决我的问题,尽管它们解决了非常相似的问题

所以我的问题是:我有一个路径变量,它可能包含字符“/”。相同的值还包含其他特殊字符,如“+”等。基本上所有有效的Base64字符

但是SpringMVC抛出404,日志显示找不到处理程序。我也尝试在path变量中使用正则表达式,但没有效果。下面是我的代码片段:

http://localhost:8080/sale/public/viewSaleDetails/b91a03730a746a2b27e1c7bbbd94ddf6a9df593301cd96c606348df5eed235da.FkJJbOqEM8Xvhffe6FwUdQ8/mMCD4+fxpY7w5L9kbJ8=
是我的网址。如果您看到它有/在路径变量值中。连同“.”和“+”和“=”一起。如果我删除字符“m”和“8”之间的字符,则Spring会正确映射这一点。但从价值上来说,它根本不起作用。我尝试了很多东西,包括字符编码过滤器,pathvariable中的正则表达式等等。请帮助

另外,我不想尽可能地使用请求参数

@RequestMapping(value = "/public/viewSaleDetails/{id}", method = RequestMethod.GET)
这是我的地图。此外,从浏览器中点击url,因为它没有任何url编码。我在浏览器的网络栏上跟踪了它,但它并没有按预期编码。我使用的是Spring4.2.8发行版和Java8以及Tomcat8,路径中有相应的斜杠。由于讨论的原因,在框架层次上改变匹配策略是不合理的。问题是由于而产生的,我建议根据创建值解析器

以下是此类解析器的示例代码:

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;
    }
}
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.core.MethodParameter;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入org.springframework.web.bind.support.WebDataBinderFactory;
导入org.springframework.web.context.request.NativeWebRequest;
导入org.springframework.web.context.request.RequestAttributes;
导入org.springframework.web.method.support.HandlerMethodArgumentResolver;
导入org.springframework.web.method.support.model和ViewContainer;
导入org.springframework.web.servlet.HandlerMapping;
导入org.springframework.web.servlet.config.annotation.EnableWebMvc;
导入org.springframework.web.servlet.config.annotation.WebMVCConfigureAdapter;
导入java.util.List;
@SpringBoot应用程序
公共类示例SpringApp{
公共静态void main(字符串[]args){
run(SampleSpringApp.class,args);
}
}
@RestController
类采样控制器{
@请求映射(“/records/**”)
公共字符串getId(Id){
返回id.id;
}
}
@配置
@EnableWebMvc
类WebConfig扩展了WebMVCConfigureAdapter{
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
ArgumentResolver.add(新的IdResolver());
}
}
类IdResolver实现HandlerMethodArgumentResolver{
@凌驾
公共布尔支持参数(MethodParameter){
返回Id.class.isAssignableFrom(parameter.getParameterType());
}
@凌驾
公共对象resolveArgument(MethodParameter参数,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory)引发异常{
String basePath=((String)webRequest.getAttribute(
HandlerMapping.BEST_MATCHING_PATTERN_属性,
RequestAttributes.SCOPE\u请求
)).替换(“**”和“);
字符串id=((字符串)webRequest.getAttribute(
HandlerMapping.PATH\u在\u HANDLER\u MAPPING\u属性中,
RequestAttributes.SCOPE\u请求
)).替换(基本路径“”);
返回新Id(Id);
}
}
类Id{
公共最终字符串id;
Id(字符串Id){
this.id=id;
}
}
路径中有相应的匹配斜杠。由于讨论的原因,在框架层次上改变匹配策略是不合理的。问题是由于而产生的,我建议根据创建值解析器

以下是此类解析器的示例代码:

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;
    }
}
导入org.springframework.boot.SpringApplication;
导入org.springframework.boot.autoconfigure.springboot应用程序;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.core.MethodParameter;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入org.springframework.web.bind.support.WebDataBinderFactory;
导入org.springframework.web.context.request.NativeWebRequest;
导入org.springframework.web.context.request.RequestAttributes;
导入org.springframework.web.method.support.HandlerMethodArgumentResolver;
导入org.springframework.web.method.support.model和ViewContainer;
导入org.springframework.web.servlet.HandlerMapping;
导入org.springframework.web.servlet.config.annotation.EnableWebMvc;
导入org.springframework.web.servlet.config.annotation.WebMVCConfigureAdapter;
导入java.util.List;
@SpringBoot应用程序
公共类示例SpringApp{
公共静态void main(字符串[]args){
run(SampleSpringApp.class,args);
}
}
@RestController
类采样控制器{
@请求映射(“/records/**”)
公共字符串getId(Id){
返回id.id;
}
}
@配置
@EnableWebMvc
类WebConfig扩展了WebMVCConfigureAdapter{
@凌驾
public void addArgumentResolver(列出ArgumentResolver){
ArgumentResolver.add(新的IdResolver());
}
}
类IdResolver实现HandlerMethodArgumentResolver{
@凌驾
公共布尔支持参数(MethodParameter){
返回Id.class.isAssignableFrom(parameter.getParameterType());
}
@凌驾
公共对象resolveArgument(MethodParameter参数,