通过RequestMapping

时间:2016-06-13 21:56:41

标签: java spring spring-mvc

我需要在服务器端调用一堆Spring Controller方法,但我将拥有的是@RequestMapping值。有没有办法做到这一点?

我知道这可以做到,因为它是通过MockMvc在测试框架中使用的。我想要那个确切的功能:

String a = mockMvc.perform(get("/foo/bar/{id}", foobarId)).andReturn().getResponse().getContentAsString(); 
String b = mockMvc.perform(get("/foo/car/{id}", foobarId)).andReturn().getResponse().getContentAsString(); 
String totals = a + b;

坦率地说,我正在考虑使用它,因为它似乎完全符合我的要求。使用它会有问题吗?我只是将WebApplicationContext自动装入控制器,这将起作用。对? :)

编辑

重定向不是我想要的。我不想连接电话,每次通话也必须能够被网络浏览器用作独立的方法

更新

在我看来,当spring启动时,它会进行组件扫描,查找@Controllers和@RequestMapping,并且必须制作某种类型的Map来映射URL class.method()对吗?它不会扫描每个呼叫的所有类。问题是,一旦扫描并加载了这张地图,只有控制器的开发者可以访问它吗?

2 个答案:

答案 0 :(得分:0)

你想要的是redirect,如:

@RequestMapping(value = "/foo/bar/{foobarId}")
public String testView (@PathVariable("foobarId") String foobarId) {
    return "any view";
}

@RequestMapping(value = "test")
public String test (String msg) {
    String foobarId = .....;
    return "redirect:/foo/bar/" + foobarId;
}

答案 1 :(得分:0)

这完全是黑客攻击,但完全有效:

@Controller
@RequestMapping(value = "/TEST")
public class TestController {

private MockMvc mockMvc;
private WebApplicationContext wbctx = null;
@Autowired
ServletContext servletContext;

public void init() {
    if(wbctx==null) {
        wbctx =  WebApplicationContextUtils.getWebApplicationContext(servletContext);
        mockMvc = MockMvcBuilders.webAppContextSetup(wbctx).build();
    }
}

@RequestMapping(value = "/test")
@ResponseBody
public String testme() throws Exception {
    init();
    String a =  mockMvc.perform(get("/foo/bar/{id}", 1)).andReturn().getResponse().getContentAsString();  
    String b =  mockMvc.perform(get("/foo/car/{id}", 1)).andReturn().getResponse().getContentAsString();  
    return a+b;
}
}