Spring MVC控制器使用javax.ws.rs.CookieParam注解报错求助
嘿,这个问题我碰到过,核心原因很简单——你用错注解啦!
为什么会报错?
javax.ws.rs.CookieParam是JAX-RS(Java RESTful Web Services)规范里的注解,是给Jersey、RESTeasy这类JAX-RS实现框架用的,而Spring MVC有自己一套参数绑定的注解体系,根本不识别这个JAX-RS的注解。
你看到的报错信息:
Caused by: java.lang.IllegalStateException: No parameter name specified for argument of type [java.lang.String], and no parameter name information found in class file either.
本质是Spring MVC无法识别@CookieParam,只能 fallback 到尝试读取方法参数名,但你用的是Java 6,默认编译时不会保留方法参数的名称信息(Java 8+可通过-parameters参数开启),所以才抛出了这个找不到参数名称的异常。
而你用HttpServletRequest.getCookies()能正常工作,是因为Spring MVC原生支持直接注入Servlet API对象(比如HttpServletRequest),和JAX-RS注解没有关系。
正确解决方案:使用Spring MVC原生的@CookieValue注解
直接把@CookieParam换成Spring MVC专门用来绑定Cookie值的@CookieValue注解即可,完美适配你的场景。修改后的代码如下:
@Override public void cookieTest( @CookieValue("testToken") String testCookie, HttpServletRequest request ) { // 现在testCookie直接就是testToken对应的Cookie值 System.out.println("testToken的值:" + testCookie); // 你原来的遍历验证代码可以保留 Cookie[] cookies = request.getCookies(); for( Cookie cookie : cookies ) { if( cookie.getName().equals( "testToken" ) ) { System.out.println( "found testToken" ); } } }
如果这个Cookie不是请求必传的,还可以添加required = false配置,避免没有该Cookie时抛出异常:
@CookieValue(value = "testToken", required = false) String testCookie
额外说明:非要用JAX-RS注解怎么办?
如果因为特殊需求必须使用@CookieParam,你需要引入JAX-RS的实现框架(比如Jersey),并配置Spring与JAX-RS的集成,但这完全没必要——Spring MVC已经提供了更直接、更适配的@CookieValue,何必多此一举呢?
内容的提问来源于stack exchange,提问作者Spark323

