2013-12-19 3 views
3

Я получаю сообщение о том, что запрос, отправленный клиентом, был синтаксически неправильным. Что делается неправильно? Вот мой код:Spring MVC @RequestBody JSON

@Entity 
@Table(name = "display") 
public class Display { 
    private String diagonal; 
    private String aspectRatio; 
    //getter and setter 
} 



    $.ajax({ 
      type:'POST', 
      url:'/admin/updateDisplay', 
      data:{'diagonal':"sss"} 
     }) 



@Controller 
@RequestMapping(value = "/admin") 
public class AdminController { 

    @RequestMapping(value = "/updateDisplay", method = RequestMethod.POST) 
    public String updateDisplay(@RequestBody Display display){ 

     System.out.print(display); 
     return null; 
    } 

}

ответ

1

Используйте следующее:

$.ajax({ 
     type:'POST', 
     url:'/admin/updateDisplay', 
     data:{"diagonal":"sss","aspectRatio":"0.5"}, 
     contentType: 'application/json', 
     dataType: 'json', 
    }) 

это работает.

EDIT

Если загружается контекст приложения Spring, используя annotaitons, то ваш класс конфигурации должен иметь:

@Override 
protected void configureContentNegotiation(
     ContentNegotiationConfigurer configurer) { 
    configurer.favorPathExtension(false).favorParameter(true) 
      .parameterName("mediaType").ignoreAcceptHeader(true) 
      .useJaf(false).defaultContentType(MediaType.APPLICATION_JSON) 
      .mediaType("xml", MediaType.APPLICATION_XML) 
      .mediaType("json", MediaType.APPLICATION_JSON); 
} 

И ваш запрос Ajax должен включать в себя

contentType: 'application/json', 
dataType: 'json', 

чек измененный вызов ajax выше.

Если вы загружая контекст приложения пружинный с помощью XMLs затем используйте ниже:

<bean id="contentNegotiationManager" 
     class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
    <property name="favorParameter" value="true" /> 
    <property name="parameterName" value="mediaType" /> 
    <property name="ignoreAcceptHeader" value="true"/> 
    <property name="useJaf" value="false"/> 
    <property name="defaultContentType" value="application/json" /> 

    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json" /> 
      <entry key="xml" value="application/xml" /> 
     </map> 
    </property> 
</bean> 

Для получения более подробной информации о написании RESTful веб-сервисов с Spring 3.2 см мой blog

+0

Это не работает, htt6 Статус 415: Сервер отказал этот запрос, потому что объект запроса в формате, который не поддерживается запрашиваемым ресурсом для запрошенного метода. –

+0

yeah .. u необходимо отправить contentType = application/json , и вы должны настроить свой весенний контекст приложения для обработки запросов json ... см. Edit. – dharam

3

Я думаю, что вы должны сказать, что тип служебной информации будет потреблять весну, чтобы знать, как ее отменить. Возможно application/json.

@RequestMapping(value = "/updateDisplay", method = {RequestMethod.POST}, 
consumes = {"application/json"}) 

Возможно, некоторые библиотеки Json тоже, как Джексон.

+0

та же ошибка 415. –

0

Не требуется @RequestBody.

С @RequestBody Spring вызывает конвертер, который принимает весь запрос и преобразует его в объект требуемого типа. Вы отправляете свои данные как application/x-www-form-urlencoded, что по умолчанию является jQuery, и для этого нет встроенного конвертера.

Без @RequestBody при отправке данных формы весна создает пустой объект и устанавливает свойства на основе данных, которые вы отправили. Итак, в вашем случае Spring сделает что-то вроде

display = new Display(); 
display.setDiagonal("sss"); 

Какой, я думаю, это то, что вы хотите.

0

Я не знаю, если это ваша проблема тоже, но с меня value неправильно и вызвал error 405, пример:

@RequestMapping(value = "/planilha/{id}", method = RequestMethod.PUT) 
    public String update(@PathVariable("id") String id, @RequestBody String jsonStr) { 
     BasicDBObject json = ((BasicDBObject) JSON.parse(jsonStr)); 
     PlanilhaDAO dao = new PlanilhaDAO(); 
     BasicDBObject ola = dao.update(id, json); 

     return ola.toString(); 
    } 

    @RequestMapping(value = "/planilha/{id}", method = RequestMethod.DELETE) 
    public String delete(@PathVariable("id") String id) { 
     PlanilhaDAO dao = new PlanilhaDAO(); 
     BasicDBObject temp = dao.remove(id); 

     return temp.toString(); 
    } 

, необходимые изменения для:

@RequestMapping(value = "/planilha/{id}/**", method = RequestMethod.PUT) 
    public String update(@PathVariable("id") String id, @RequestBody String jsonStr) { 
     BasicDBObject json = ((BasicDBObject) JSON.parse(jsonStr)); 
     PlanilhaDAO dao = new PlanilhaDAO(); 
     BasicDBObject ola = dao.update(id, json); 

     return ola.toString(); 
    } 

    @RequestMapping(value = "/planilha/{id}", method = RequestMethod.DELETE) 
    public String delete(@PathVariable("id") String id) { 
     PlanilhaDAO dao = new PlanilhaDAO(); 
     BasicDBObject temp = dao.remove(id); 

     return temp.toString(); 
    } 
0

Вы должен преобразовать данные JSON в строку перед тем, как передать ее в Spring MVC.Итак, вот решение в вашем случае:

$.ajax({ 
    type:'POST', 
    url:'/admin/updateDisplay', 
    data: JSON.stringify({'diagonal':"sss"}) 
}) 
Смежные вопросы