2015-05-03 19 views
2

我作为一个路径变量发送电子邮件ID服务器为():当路径变量包含@ResponseBody然后不工作

@RequestMapping(value = "/resetPassword/{email:.+}", method = RequestMethod.GET) 
public @ResponseBody MyResponse resetPassword(HttpServletRequest request, @PathVariable("email") String email) 
{ 
    MyResponse res = new MyResponse(); 
    res.setMsg("some Text"); 
    return res; 
} 

,我的jQuery的调用方法:

var email = $("#fpusername").val(); 
$.ajax({ 
    type : "GET", 
    url : "./useraccount/resetPassword/" + email, 
    dataType : "json", 
    async : true, 
    success : function(data) { 
     alert(data.msg); 
    } 
}); 

同样的方法工作时,我送[email protected]email值,但提示以下错误:发送[email protected]

406 [由该请求所标识的资源仅能够 与根据该请求的特性不能接受产生响应的“接受”报头]

+1

可能重复[(。)Spring MVC的@PathVariable与点也越来越截断(HTTP://计算器。com/questions/16332092/spring-mvc-pathvariable -with-dot-is-getting-truncated) –

+0

@Martin Frey:不,这里的问题不在于我的路径变量在(。)之后被截断。这里的问题是当路径变量包含一个(。),那么响应正文注解不起作用,因此ajax没有从服务器得到正确的响应 –

+0

真的。我错过了正则表达式。您是否尝试将响应mediatype修复为json? –

回答

1

doc警告有关使用等效例子

缺省时,Spring MVC自动执行此陷阱".*"后缀模式 匹配,使映射到/person的控制器也隐式地 映射到/person.*。这允许通过文件 扩展名来指示内容类型,例如, /person.pdf,/person.xml等。然而,当映射的最后一个路径段是变量的URI 时,常见的缺陷是 。 /person/{id}。尽管对于/person/1.json的请求 将正确地导致路径变量id=1和扩展".json",而当 ID自然包含点(例如, /person/[email protected]结果 与预期不符。很明显,这里".com"不是文件 的扩展名。

当决定了内容类型时,Spring使用所谓的PPA策略(Path,Parameter,Accept header)。这里你的.com被视为一个路径(扩展名),并试图解决基于它的表示,因此你是个例外。你可以采取两条道路来解决这个问题。

要么配置Spring只使用注册的后缀,例如在XML

<mvc:annotation-driven> 
    <mvc:path-matching registered-suffixes-only="true" /> 
</mvc:annotation-driven> 

的doc和提供相应的Java配置here

或通过路径关闭mathching如果这是给你的可行的解决方案,例如

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
    <property name="mediaTypes" > 
     <value> 
      json=application/json 
      xml=application/xml 
     </value> 
    </property> 
</bean> 

的doc和相应的Java配置提供的here

0

已映射web.xml中的URL模式? 如果您有没有将网址映射这种方式来接受您的网址由弹簧为有效:

<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>*.com</url-pattern> 
</servlet-mapping>