我正在尝试使用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
,效果很好。我有几个问题。
@PathVariable
在使用Groovy时会给出错误400?{name:.+}
中使用RequestMapping
。 :.+
的含义是什么?提前谢谢。
编辑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属性。
答案 0 :(得分:0)
经过调试,我终于找到了什么问题。它在我的代码中,而不是在Spring中。
在Welcome2Controller.groovy中写道:
@RequestMapping(name = '/{name}', method = RequestMethod.GET)
应该是
@RequestMapping(value = '/{name}', method = RequestMethod.GET)
感谢您@cfrick帮助:)