为了启用@ResponseBody
和ResponseEntity
方法的JSONP支持,需声明一个@ControllerAdvice
的bean,它扩展了AbstractJsonpResponseBodyAdvice
,如下所示其中constructor参数指示JSONP查询参数名称:
- package com.somnus.advice;
-
- import org.springframework.core.annotation.Order;
- import org.springframework.web.bind.annotation.ControllerAdvice;
- import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
-
- /**
- * 对使用HttpMessageConverter的@ResponseBody的支持
- */
- @Order(2)
- /* 需要被扫描 */
- @ControllerAdvice(basePackages = "com.somnus")//配置你需要路径下的控制器
- public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
- public JsonpAdvice() {
- super("callback"); //指定jsonpParameterNames
- }
- }
- @Controller
- @RequestMapping(value = "response")
- public class ResponseBodyBindController {
-
- @GetMapping(value="responsebodybind3")
- @ResponseBody
- public Account responsebodybind2(String username,String password){
- Account account = new Account(username,password);
- System.out.println("responsebodybind3:" + account);
- return account;
- }
- }
并且值得一提的是,如果你希望可以支持多种参数,都能支持JSONP,构造方法可以设置多个值,如:
- @ControllerAdvice(basePackages = "com.somnus")//配置你需要路径下的控制器
- public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
- public JsonpAdvice() {
- super("callback", "jsonp"); //指定jsonpParameterNames
- }
- }
那么你将惊喜的看到
- /**
- * <p>.json结尾返回json</p>
- * <p>.xml结尾返回xml</p>
- * @author:Somnus
- * @return
- */
- @RequestMapping(value="viewResolver", method = {RequestMethod.GET})
- public ModelAndView viewResolver(){
- ModelAndView mv = new ModelAndView();
- Account account = new Account();
- account.setUsername(WebUtil.getRequest().getParameter("username"));
- account.setPassword(WebUtil.getRequest().getParameter("password"));
- mv.addObject(account);
- mv.setViewName("viewResolver");
- return mv;
- }