package com.haogrgr.test.ctrl;
import java.lang.reflect.Method;
import java.util.function.Function;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import com.haogrgr.test.util.AppContextUtil;
/**
* spring4.2公开了运行期添加HandlerMapping的方法
*
* @author desheng.tu
* @since 2015年8月3日 下午3:13:02
*
*/
@Controller
public class DynamicHandlerMappingController {
@ResponseBody
@RequestMapping(value = "/mapping/add")
public String addHandlerMappingDiy() throws Exception {
RequestMappingHandlerMapping mapping = AppContextUtil.getBean(RequestMappingHandlerMapping.class);
MappingJackson2JsonView jsonView = AppContextUtil.getBean(MappingJackson2JsonView.class);
RequestMappingInfo info = RequestMappingInfo.paths("/mapping/add_1").methods(RequestMethod.GET).build();
//这样就会报, Object不能被转换为HttpServletRequest, 因为Lambda生成的接口实例类方法签名是(Object)Object的, 然后里面在强制类型转换的.
//所以Spring反射根据参数类型来注入参数时, 获取到的是Object类型
Function<HttpServletRequest, ModelAndView> handler = req -> {
ModelAndView mav = new ModelAndView();
mav.addObject(req.getRequestURL());
mav.setView(jsonView);
return mav;
};
//匿名内部类就好
handler = new Function<HttpServletRequest, ModelAndView>() {
public ModelAndView apply(HttpServletRequest req) {
ModelAndView mav = new ModelAndView();
mav.addObject(req.getRequestURL());
mav.setView(jsonView);
return mav;
}
};
Method method = handler.getClass().getMethod("apply", Object.class);
mapping.registerMapping(info, handler, method);
return "succ";
}
}