2014-01-27 3 views
0

Я пытаюсь использовать @ModelAttribute, но я не могу пройти мимо этого 400 (неверный запрос). Я просмотрел тонну сообщений SO, но никто, кажется, не исправляет то, что я вижу.ошибка 400 при использовании @modelAttribute в представлении формы ajax

Вот несколько вещей, которые я пробовал:

  • параметры переупорядочения на функции
  • не имеющие («someForm») параметры по модели атрибуту
  • направляющих его как HTML форма вместо пружинной формы

Я попытался упростить это до минимума до того, как положить его на СО, и все еще не могу заставить его уйти. Есть идеи?

Вот контроллер

@RequestMapping(value = "/r/save.spr", method = RequestMethod.POST) 
public String saveItem(@RequestParam(value = "someId") UUID someId, 
         @ModelAttribute("thisForm") StyleData styleData, 
         BindingResult bindingResult) { 
    System.out.println(); 

    return null; 
} 

Вот модель.

public class StyleData { 

    public String itemId; 

    public String getItemId() { 
     return itemId; 
    } 

    public void setItemId(String itemId) { 
     this.itemId = itemId; 
    } 

Вот мой JSP

<form:form id="thisForm" modelAttribute="thisForm"> 
    <input name="itemId"/> 
</form:form> 

Вот JS я использую, чтобы отправить форму.

$("#thisForm").submit(function() { 
    var str = $("#thisForm").serialize(); 

    $.ajax({ 
     type: "post", 
     data: str, 
     url: "/r/save.spr?someId=${someId}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function() { 
      console.log("here") 
     }, 
     error: function(e){ 
      debugger; 
      console.log("fail") 
     } 
    }); 

    console.log("Here"); 
    return false; 
}); 

UPDATE 1; В комментариях я попробовал следующее;

$("#thisForm").submit(function() { 
    var str = $("#thisForm").serialize(); 

    $.ajax({ 
     type: "post", 
     data: str, 
     url: "/r/save.spr?someId=${someId}", 
     success: function() { 
      console.log("here") 
     }, 
     error: function(e){ 
      debugger; 
      console.log("fail") 
     } 
    }); 

    console.log("Here"); 
    return false; 
}); 

Update 2:

меня спросили, что str возвращается.

"itemId=aa" 
+1

Атрибуты модели десериализованы из параметров запроса, но вы, по-видимому, публикуете JSON. –

+0

Параметры запроса или JSON? Выбери один. Для параметров запроса сохраните .serialize() и удалите dataType: 'json'. Для JSON используйте JS-библиотеку, такую ​​как JSON3 + Spring MVC @RequestBody + Jackson library –

+0

, поэтому я попытался с измененным вызовом ajax, удалив тип данных JSON и тип приложения json, все еще бросая 400. – zmanc

ответ

0

Я вижу ряд вопросов.

Сначала я предлагаю вам проанализировать запрос/ответ на оба уровня (клиент и сервер). Например, если ваш клиент является веб-браузером, например, Chromium или FireFox, инструменты разработчика в этих браузерах выставляют запрос, отправленный на сервер, и данные ответа. На стороне сервера я бы использовал java-отладчик и сначала проверил, что ваш метод достигнут. Вы хотите убедиться, что ваше сопоставление/конфигурация верна.

Некоторые детали. На клиенте, пожалуйста, проверьте URL-адрес. Я задаю вопрос о необходимости строки запроса `? SomeId = $ {someId}? Вам не нужна строка запроса для запроса на отправку.

На сервере ваш метод подписи должен быть:

public String saveItem(@ModelAttribute StyleData styleData, 
     BindingResult bindingResult, Model model) 

Примечание! В настоящее время у вас есть тип возврата String (это нормально), но вы возвращаете null. Если вам нужно жестко закодировать значение, верните действительный путь.

Последний отзыв. Вы также можете макетировать свой клиентский запрос с помощью Curl.If вы попробуете это, вы обнаружите, что вам не нужен ; charset=utf-8 в типе контента.

Надеюсь, что это поможет. Пожалуйста, опубликуйте результат анализа:

+0

Метод не достигается. OP получил 400 из «DispatcherServlet» от Spring. Возможно, OP _does_ нуждается в строке запроса. Почему должна быть подпись метода? Это запрос AJAX, возможно, OP не хочет возвращать тело ответа. В этом случае подходит «null». –

+0

Я положил значение null, потому что я еще не закончил реализацию, так как я даже не попадал в метод, нет смысла иметь действительный доход в этой точке. Также я проверил, что идентификатор передается. – zmanc

+0

Привет, Спасибо за ответ. Можете ли вы опубликовать то, что веб-браузер отправляет в почтовом запросе. Можете ли вы захватить данные. Далее на сервере почему бы не добавить простой метод, который отвечает на запрос «получить» (без парм). Это должно помочь проверить, есть ли у вас конфигурация контроллера или проблема с web.xml. Используйте веб-браузер или Curl для проверки запроса на получение. Убедитесь, что путь к серверу правильный. Удачи. – lorinpa

0

Обнаружил, что из-за этого мне не хватает контекста приложения по URL-адресу. Ненавижу, что это было всего лишь 400, вместо чего-то более полезного.

+0

Итак, ваш клиент делал запрос на неправильный URL? Можете ли вы опубликовать статус? Теперь это закрыто? Вопрос ответил :) Код работает? – lorinpa

+1

400 ошибок сложны с Spring MVC. Кажется, что они только регистрируются на уровне отладки. –

Смежные вопросы