spring boot:RequestMapping

时间:2016-12-01 10:55:32

标签: spring spring-mvc spring-boot

我有以下三种REST API方法:

@RequestMapping(value = "/{name1}", method = RequestMethod.GET)
    public Object retrieve(@PathVariable String name1) throws UnsupportedEncodingException {
        return configService.getConfig("frontend", name1);
    }

@RequestMapping(value = "/{name1}/{name2}", method = RequestMethod.GET)
public Object retrieve(@PathVariable String name1, @PathVariable String name2) throws UnsupportedEncodingException {
    return configService.getConfig("frontend", name1, name2);
}

@RequestMapping(value = "/{name1}/{name2}/{name3}", method = RequestMethod.GET)
public Object retrieve(@PathVariable String name1, @PathVariable String name2, @PathVariable String name3) {
    return configService.getConfig("frontend", name1, name2,name3);
}

getConfig方法配置为接受多个参数,如:

 public Object getConfig(String... names) {

我的问题是:是否可以仅使用一个方法/ RequestMapping来实现上述RequestMapping?

感谢。

4 个答案:

答案 0 :(得分:3)

简单方法

您可以在映射中使用/**来获取任何URL,然后从映射路径中提取所有参数。 Spring有一个常量,允许您从HTTP请求中获取路径。您只需删除映射中不必要的部分并拆分其余部分以获取参数列表。

import org.springframework.web.servlet.HandlerMapping;

@RestController
@RequestMapping("/somePath")
public class SomeController {

    @RequestMapping(value = "/**", method = RequestMethod.GET)
    public Object retrieve(HttpServletRequest request) {
        String path = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
        String[] names = path.substring("/somePath/".length()).split("/");
        return configService.getConfig("frontend", names);
    }

}

更好的方法

但是,路径变量应该用于识别应用程序中的资源,而不是用作给定资源的参数。在这种情况下,建议坚持使用简单的请求参数。

http://yourapp.com/somePath?name=value1&name=value2

您的映射处理程序看起来会更简单:

@RequestMapping(method = RequestMethod.GET)
public Object retrieve(@RequestParam("name") String[] names) {
    return configService.getConfig("frontend", names);
}

答案 1 :(得分:2)

您应该使用@RequestParam而不是方法POST来实现您想要的效果。

@RequestMapping(name = "/hi", method = RequestMethod.POST)
@ResponseBody
public String test(@RequestParam("test") String[] test){

    return "result";
}

然后你这样发帖:

enter image description here

因此,您的字符串数组将包含两个值

同样在REST中,路径对应于资源,因此您应该问自己“我正在暴露的资源是什么?”。它可能类似于/ config / frontend,然后通过请求参数和/或HTTP动词指定您的选项

答案 2 :(得分:1)

您可以使用request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)检索完整路径,然后解析它以获取所有值。

答案 3 :(得分:1)

这应该有效:

@SpringBootApplication
@Controller
public class DemoApplication {


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

@RequestMapping(value ={"/{name1}","/{name1}/{name2}","/{name1}/{name2}/{name3}"})
public @ResponseBody String testMethod(
        @PathVariable Map<String,String> pathvariables)
{
    return test(pathvariables.values().toArray(new String[0]));
}

private String test (String... args) {
    return Arrays.toString(args);
}

}