2013-03-28 4 views
13

Я пытаюсь отправить JSON-представление карты в контроллер в качестве параметра POST.Передача JSON-карты в Spring MVC-контроллер

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" }) 
public @ResponseBody Results search(@RequestParam("filters") HashMap<String,String> filters, HttpServletRequest request) { 
     //do stuff 
} 

Я обнаружил, что @RequestParam бы просто выбросить 500 ошибки, поэтому я попытался с помощью @ModelAttribute вместо этого.

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" }) 
public @ResponseBody Results search(@ModelAttribute("filters") HashMap<String,String> filters, HttpServletRequest request) { 
     //do stuff 
} 

Это правильно ответит на запросы, но я понял, что Карта пуста. С последующим экспериментом я обнаружил, что любой объект (а не только HashMap) будет создан, но никакие поля не будут заполнены. У меня есть Jackson на моем пути к классам, и мои контроллеры будут отвечать JSON. Тем не менее, похоже, что моя текущая конфигурация не позволяет Spring считывать JSON через параметр GET/POST.

Как передать объекты JSON объектов с клиентского AJAX-запроса на контроллер Spring в качестве параметра запроса и получить объект Java?

EDIT Добавление моя соответствующая конфигурация Spring

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="mediaTypes"> 
     <map> 
     <entry key="html" value="text/html" /> 
     <entry key="json" value="application/json" /> 
     </map> 
    </property> 
    <property name="viewResolvers"> 
     <list> 
     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
      <property name="prefix" value="/WEB-INF/jsp/" /> 
      <property name="suffix" value=".jsp" /> 
     </bean> 
     </list> 
    </property> 
    <property name="defaultViews"> 
     <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
      <property name="prefixJson" value="true" /> 
     </bean> 
     </list> 
    </property> 
    </bean> 
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
     <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> 
     </list> 
    </property> 
    </bean> 

По предложению в комментатора, я попытался @RequestBody. Это будет работать, если строки JSON котируются с двойными кавычками.

@RequestMapping(value = "/search.do", method = RequestMethod.POST, consumes = { "application/json" }) 
public @ResponseBody Results<T> search(@RequestBody HashMap<String,String> filters, HttpServletRequest request) { 
     //do stuff 
} 

Это делает решить мою проблему сразу же, но я до сих пор интересно, как НУ может проходить в несколько объектов JSON через вызов AJAX.

+0

Вы имеете MappingJacksonJsonView боб на ваш весенне-context.xml? –

+0

Как вы отправляете данные, как часть формы, запрос ajax? – clav

+0

Отметьте аннотацию '@ RequestBody'. –

ответ

4

Это решение моей первой проблемы, но мне все же интересно узнать, как можно передать несколько объектов JSON через вызов AJAX.

Лучший способ сделать это - иметь объект-обертку, содержащий два (или несколько) объектов, которые вы хотите передать. Затем построить свой объект JSON как массив из двух объектов, т.е.

[ 
    { 
    "name" : "object1", 
    "prop1" : "foo", 
    "prop2" : "bar" 
    }, 
    { 
    "name" : "object2", 
    "prop1" : "hello", 
    "prop2" : "world" 
    } 
] 

Затем в методе контроллера вы получаете тело запроса в виде одного объекта и извлечь два содержали объекты. то есть:

@RequestMapping(value="/handlePost", method = RequestMethod.POST, consumes = {  "application/json" }) 
public void doPost(@RequestBody WrapperObject wrapperObj) { 
    Object obj1 = wrapperObj.getObj1; 
    Object obj2 = wrapperObj.getObj2; 

    //Do what you want with the objects... 


} 

Объект обертка будет выглядеть примерно так ...

public class WrapperObject {  
private Object obj1; 
private Object obj2; 

public Object getObj1() { 
    return obj1; 
} 
public void setObj1(Object obj1) { 
    this.obj1 = obj1; 
} 
public Object getObj2() { 
    return obj2; 
} 
public void setObj2(Object obj2) { 
    this.obj2 = obj2; 
} 

} 
+0

Спасибо за ответ RequestBody. У меня была карта в моем запросе, но она всегда была бы пустой, и ответ был бы пустым. Теперь RequestBody перед Картой исправил это! – Aliya

1

Вы можете использовать библиотеку Джексона конвертировать из Json к карте.

@ веб-context.xml

<bean id="messageAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

@maven зависимостей:

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-core-lgpl</artifactId> 
    <version>1.9.13</version> 
</dependency> 
<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-lgpl</artifactId> 
    <version>1.9.13</version> 
</dependency> 

@Controller

@RequestMapping(value = "/method", method = RequestMethod.DELETE) 
public String method(
       @RequestBody Map<String, Object> obj){ 

@Request (например,jquery Ajax)

Это намного проще с Python Framework или Play! ufff

+2

Jackson 1.9.x находится в режиме обслуживания; Вместо этого я бы предложил Jackson 2.3.x. –

0

Вы не получаете json правильно.

ли подобное ....

/* 
* Mapping for Demographics And Profiling Question Filter 
*/ 
@RequestMapping (value = "/generalFilter") 
public void ageFilteration(@RequestParam Map <String,String> filterParams,HttpServletRequest request,HttpServletResponse response) throws IOException 
{ 
    // System.out.println("Geographies in Controller :"+ filterParams.get("geographies")); 
    List<FeasibilityBean> feasibilityList = feasibilityDao.getGeneralFeasibilityList(filterParams,request); 
    // System.out.println(" General Filter List Size:"+feasibilityList.size()); 
    response.getWriter().print(new Gson().toJsonTree(feasibilityList,new TypeToken<List<FeasibilityBean>>(){}.getType())); 
} 

}

Js Код

var ages='',ageCond='',genders='',genderCond=''; 

    $.ajax({ 
     type: "POST", 
     url : url, 
     data : {ages:ages,ageCond:ageCond,genders:genders,genderCond:genderCond}, 
     beforeSend: function() { 
      $(thisVar).find('i').addClass('fa-spin'); 
     }, 
     success : function(feasibilityJson){ 

     }, 
     error : function(data) { 
      alert(data + "error"); 
     }, 
     complete:function(){ 
      $(thisVar).find('i').removeClass('fa-spin'); 
     } 
    }); 

или вы хотите, чтобы связать компонент с JSON ....

https://stackoverflow.com/a/21689084/5150781 https://stackoverflow.com/a/37958883/5150781

0

Я передал объект карты на Java, используя код ниже:

Javascript Код:

var values = { 
        "object1" : JSON.stringify(object1), 
        "object2" : JSON.stringify(object2) 
      }; 
var response = $http.post(url,data); 

Server Side Код:

@RequestMapping(value = "/deleteData",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    public Result deleteData(@RequestBody HashMap<String, Object> dataHashMap) { 
    Object1 object1= (Object1) JsonConvertor.jsonToObject((String) dataHashMap.get("object1"), Object1.class); 
     Object2 object2= (Object2) JsonConvertor.jsonToObject((String) dataHashMap.get("object2"), Object2.class); 
} 

JsonConvertor Класс:

public class JsonConvertor { 
    public static <T> Object jsonToObject(String json, Class<T> clazz) { 
    if (json == null) 
     throw new IllegalArgumentException("null cannot be converted to Object"); 
    Gson gson = new GsonBuilder().disableHtmlEscaping().setDateFormat("dd-MMM-yyyy").create(); 
    return gson.fromJson(json, clazz); 
    } 
} 
+0

Вы забыли сказать, что такое '' JsonConvertor''. – kryger

+0

Отредактировано решение, –

0
@RequestMapping(method = RequestMethod.POST) 
    public HttpEntity<Resource<Customize>> customize(@RequestBody String customizeRequest) throws IOException { 
     Map<String, String> map = mapper.readValue(customizeRequest, new TypeReference<Map<String,String>>(){}); 
     log.info("JSONX: " + customizeRequest); 
     Long projectId_L = Long.parseLong(map.get("projectId")); 
     [...] 
Смежные вопросы