wake-up-neo.net

Übergeben der JSON-Karte an den Spring MVC-Controller

Ich versuche, eine JSON-Darstellung einer Map als Parameter POST in meinen Controller zu senden. 

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

Ich habe festgestellt, dass @RequestParam nur einen Fehler von 500 ausgibt, also habe ich stattdessen @ModelAttribute verwendet. 

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

Dies würde korrekt auf Anfragen reagieren, aber ich erkannte, dass die Map leer war. Bei späteren Experimenten stellte ich fest, dass jedes Objekt (nicht nur HashMap) instanziiert werden würde, aber keine Felder ausgefüllt werden würden. Ich habe Jackson auf meinem Klassenpfad, und meine Controller antworten mit JSON. Es scheint jedoch, dass meine aktuelle Konfiguration Spring es nicht ermöglicht, JSON über einen GET/POST-Parameter einzulesen. 

Wie kann man JSON-Darstellungen von Objekten von einer clientseitigen AJAX -Anforderung an einen Spring-Controller als Anforderungsparameter übergeben und ein Java-Objekt herausholen?

EDITHinzufügen meiner relevanten Spring-Konfiguration

  <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>

Auf Anregung eines Kommentators habe ich @RequestBody ausprobiert. Dies funktioniert, solange die JSON-Zeichenfolgen in doppelten Anführungszeichen stehen.

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

Dies löst zwar mein unmittelbares Problem, aber ich bin immer noch gespannt, wie Sie über einen AJAX -Aufruf mehrere JSON-Objekte übergeben können.

15
monitorjbl

Dies löst zwar mein unmittelbares Problem, aber ich bin immer noch gespannt, wie Sie über einen AJAX -Aufruf mehrere JSON-Objekte übergeben können.

Dies erreichen Sie am besten mit einem Wrapper-Objekt, das die zwei (oder mehrere) Objekte enthält, die Sie übergeben möchten. Sie konstruieren dann Ihr JSON-Objekt als Array der beiden Objekte, d. H.

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

Dann erhalten Sie in Ihrer Controller-Methode den Request-Body als einzelnes Objekt und extrahieren die beiden enthaltenen Objekte. das heißt:

@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...


}

Das Wrapper-Objekt würde ungefähr so ​​aussehen ...

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;
}   

}
4
LTJHeron

Sie können die Jackson-Bibliothek verwenden, um von Json in Map zu konvertieren.

@ web-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 Abhängigkeiten:

<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>

@Regler

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

@Anfrage (z. B. Jquery Ajax)

$.ajax({"type": "DELETE",
        "contentType": "application/json;",
        "url": "/method",
        "data": JSON.stringify({"key": "Ricardo"}),
        "dataType": "json";}
});

Mit Python Frameworks oder Play ist das viel einfacher! ufff

2

Ich habe das Map-Objekt mit folgendem Code an Java übergeben:

Javascript Code:

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

Serverseitiger Code:

@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-Klasse:

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);
  }
}
1
Sanchi Girotra
    @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"));
       [...]
0
R.S

Als @ darios Antwort, aber für Jackson 2-Version:

spring-web-context.xml

    <bean id="messageAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
            <property name="supportedMediaTypes">    
                <list>    
                    <value>application/json;charset=utf-8</value>    
               </list>    
            </property>  
            </bean>
        </list>
    </property>
</bean>

maven pom.xml:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.6</version>
    </dependency>

Java-Controller 

@RequestMapping(value = "/search.do", method = RequestMethod.GET, consumes = { "application/json" })
public @ResponseBody Results search(@RequestBody Map<String,Object> filters, HttpServletRequest request) {
0
Yu Jiaao

Sie bekommen Json nicht richtig. 

Mach das so ....

/*
 * 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 Code 

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');
        }
    }); 

oder du willst die bohne mit json binden ....

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

0
Zigri2612