【问题标题】:Spring MVC : How to populate my Object with JSONSpring MVC:如何使用 JSON 填充我的对象
【发布时间】:2014-08-11 15:45:14
【问题描述】:

我有一个需要对象的更新方法(AJAX 服务)。这个对象由 JSon 填充,我想测试它,但我不能..

我使用 spring mvc 来设置我的服务。

我的服务:

    @RequestMapping(value="texte/updateMyObject", method= RequestMethod.POST, consumes = "application/json;charset=UTF-8")
    public void updateMyObject(MyObject myObject) throws IOException {

        logger.info("UPDATE !!!");

    }

我的对象:

public class MyObject {
private Integer id;
private String name;

public MyObject(){}

// getter & setter

}

我使用 Postman(chrome 工具)来测试我的服务:https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm

我想我必须发送好的 JSON,但我不知道是哪个。

目前我已经测试了这个模式:

"MyObject" : {"id" : "1", "name" : "test"}

或 {“id”:“1”,“名称”:“测试”}

编辑 1:

调用我的服务时,myObject的字段都是空的。

编辑 2:

我玩这种HTTP请求:

POST /myapp/texte/updateMyObject.sp HTTP/1.1
Host: localhost:8080
Content-Type: application/json; charset=UTF-8
Cache-Control: no-cache

{"id" : "1", "name" : "test"}

编辑 3:

我的配置在我的 web.xml 中弹出。如果你需要我的上下文问我。

<servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationContext-springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>*.sp</url-pattern>
</servlet-mapping>

编辑 4: 我进行了以下测试以向您展示我的对象未填充。

【问题讨论】:

  • 但它不起作用。 那句话完全没用。告诉我们如何它不起作用。你期望会发生什么?实际发生了什么?
  • 什么不起作用? {"id" : "1", "name" : "test"} 看起来很合适。
  • 这些是我的 JSON 测试不起作用。
  • 具体来说。您在“updateMyObject”方法中看到了什么。我的对象是空的吗?是别的吗?另外,“texte”是错字吗?
  • 您的控制器中缺少 @RequestBody for MyObject 参数。

标签: java json spring rest spring-mvc


【解决方案1】:

您需要将 JSON 反序列化程序库链接到您的项目,例如杰克逊:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
</dependency>

然后,使用以下控制器:

@RequestMapping(value = "texte/updateMyObject", method = RequestMethod.POST, consumes = "application/json")
public void updateMyObject(@RequestBody MyObject myObject) {
    // ...
}

发送请求时如:

POST /texte/updateMyObject
    headers:
        Content-Type: application/json
    data:
        { "id" : "1", "name" : "test" }

myObject应填写。

【讨论】:

  • 是的!使用 requestBody 它现在可以工作了,因为我做了另一个测试,但我不明白为什么我的第一个测试不起作用。我会看看为什么!谢谢。
【解决方案2】:

这一切都与您的控制器将收到的 JSON 文档中的属性名称有关。

在您的操作参数上,参数的类型必须具有与其将接收的 JSON 文档中的字段名称相匹配的属性。

例如:看看这个动作:

@RequestMapping(value="texte/updateMyObject", method=RequestMethod.POST)
String doSomething(Person person) {

}

person 类将如下所示:

class Person {
   String name;
   int age;

   //getters and setters
}

您的 JSON 文档必须是这样的:

{'name':'Henrique', 'age':35}

【讨论】:

  • 我必须发送课堂上的所有字段吗?如果我只想发送名称,我该如何构建我的 JSON?
  • 在这种情况下,您只需发送一个只有一个字段的 JSON 文档:名称。
  • 我用我的测试编辑我的帖子。我做了同样的测试,但它对我不起作用。见编辑 4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多