2015-05-03 20 views
2

Я посылаю по электронной почте идентификатор к серверу в качестве переменного пути, как (.):, когда переменный путь содержит то @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: // StackOverflow.com/questions/16332092/spring-mvc-pathvariable-with-dot-is-getting-truncated) –

+0

@Martin Frey: нет здесь проблема не в том, что моя переменная path усекается после (.). здесь проблема заключается в том, когда переменная path содержит a (.), тогда аннотация механизма ответа не работает, поэтому ajax не получает правильного ответа от сервера –

+0

. Я пропустил регулярное выражение. Вы пытались исправить ответную медитацию 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). Здесь ваш .com берется как путь (расширение), и делается попытка разрешить представление на его основе, следовательно, ваше исключение. Вы можете взять две дороги, чтобы зафиксировать это.

Либо настроить Spring использовать только зарегистрированные суффиксы, например. в XML

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

док и эквивалентный 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> 

док и эквивалентный Java конфигурации доступны here

0

сопоставили вы шаблон URL-адрес в web.xml? Если не нужно отображать URL таким образом, чтобы принять свой адрес действительной весной:

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