在Spring 4 Groovy Controller中使用@PathVariable时出错400

时间:2014-11-28 10:11:17

标签: java spring spring-mvc groovy spring-4

我正在尝试使用Groovy作为Controller的语言。我为此选择了mkyong's example。然而,我使用Maven而不是Gradle。这是我的代码:

pom.xml(仅限依赖项,此处更改为Gradle格式以供阅读)

compile 'org.springframework:spring-webmvc:4.1.2.RELEASE'
compile 'org.codehaus.groovy:groovy-all:2.3.7'
providedCompile 'javax.servlet:servlet-api:2.5'

WelcomeController.java

@Controller
public class WelcomeController {

  @RequestMapping(value = "/hello/{name:.+}", method = RequestMethod.GET)
  public ModelAndView welcome(@PathVariable("name") String name) {
    ModelAndView model = new ModelAndView();
    model.setViewName("hello/index");
    model.addObject("name", name);

    return model;
  }
}

Welcome2Controller.groovy(WelcomeController的Groovy实现)

@Controller
class Welcome2Controller {

  @RequestMapping(name = '/{name}', method = RequestMethod.GET)
  public def ModelAndView welcome(@PathVariable('name') String name) {
    def model = new ModelAndView(viewName: 'hello/index')
    model.addObject 'name', name

    model
  }
}

Welcome2Controller.class反编译

@Controller
public class Welcome2Controller implements GroovyObject {

  public Welcome2Controller() {
    CallSite[] var1 = $getCallSiteArray();
    MetaClass var2 = this.$getStaticMetaClass();
    this.metaClass = var2;
  }

  @RequestMapping(name = "/{name}", method = {RequestMethod.GET} )
  public ModelAndView welcome(@PathVariable("name") String name) {
    CallSite[] var2 = $getCallSiteArray();
    Object model = var2[0].callConstructor(ModelAndView.class, ScriptBytecodeAdapter.createMap(new Object[]{"viewName", "hello/index"}));
    var2[1].call(model, "name", name);
    return (ModelAndView)ScriptBytecodeAdapter.castToType(model, ModelAndView.class);
  }

  static {
    // omitted
  }
}

使用Java时效果很好,但在使用Groovy时出现错误400。我试图将其更改为使用@RequestParam,如下所示:

@RequestMapping(value = '/', method = RequestMethod.GET)
public def ModelAndView welcome(@RequestParam('name') String name) { /* omitted */ }

然后将HTTP请求更改为/?name=World,效果很好。我有几个问题。

  1. 为什么@PathVariable在使用Groovy时会给出错误400?
  2. Mkyong在{name:.+}中使用RequestMapping :.+ 的含义是什么?
  3. 提前谢谢。

    编辑1: 我尝试了tomcat 7和tomcat 8,两者都给了我相同的结果

    编辑2: 在org.springframework.web.servlet.DispatcherServlet中捕获的异常消息是 org.springframework.web.bind.ServletRequestBindingException:缺少类型为String 的方法参数的URI模板变量'name'。它是由Spring无法从原始Servlet请求中的uriTemplateVars(返回空值)中获取org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver引起的。为什么Spring错过了它,虽然它在Spring Boot中运行得很好?我目前正在搜索Spring如何在Servlet Request中解析put属性。

1 个答案:

答案 0 :(得分:0)

经过调试,我终于找到了什么问题。它在我的代码中,而不是在Spring中。

在Welcome2Controller.groovy中写道:

@RequestMapping(name = '/{name}', method = RequestMethod.GET)

应该是

@RequestMapping(value = '/{name}', method = RequestMethod.GET)

感谢您@cfrick帮助:)