【问题标题】:HTTP GET issue when processing JSON returned from REST Spring MVC method处理从 REST Spring MVC 方法返回的 JSON 时的 HTTP GET 问题
【发布时间】:2014-08-20 20:19:48
【问题描述】:

我在 Spring MVC 控制器中有一个方法如下:

// Gets a Person via REST.

@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)
public ModelAndView getPerson(@PathVariable("personId") String personId) {

    logger.info(RestController.class.getName() + ".getPerson() method called."); 

    Person person = personService.get(Integer.parseInt(personId));
    return new ModelAndView(view,"person", person);        
} 

该方法工作正常,但在客户端处理 JSON 的代码中,出现以下异常:

无法识别的字段“person”(类库App.model.Person),未标记为可忽略(6 个已知属性:、“personId”、“address”、“telephone”、“books”、“name”、“email” ])

代码如下:

// Set request.
        String url = ("http://localhost:8080/Library/rest/person/1");      
        HttpGetRequest httpGetRequest = new HttpGetRequest(url, "GET", ""); 

        // Make request.
        httpGetRequest.get();

// Get response.        
        if (httpGetRequest.getResponseCode() != 200) {                  
            throw new RuntimeException("Get request failed: HTTP error code: " + httpGetRequest.getResponseCode());
        } 
        else {                                      

            // Receive JSON from server and convert to Person.
            ObjectMapper mapper = new ObjectMapper(); 
            Person person = mapper.readValue(httpGetRequest.getResponse(), Person.class);
            System.out.println("Person:");
            System.out.println(person.toString());
            if (! (person.getBooks().isEmpty())) {
                System.out.println("Books:");
                for (Book book : person.getBooks()) {
                    System.out.println(book.toString());
                }
            }
        }

Person 是一个简单的 POJO,如下:

public class Person implements Serializable {

// Attributes.        
private Integer personId;        
private String name;  
private String address;   
private String telephone;       
private String email;        
private List<Book> books;

我正在使用 ModelAndView 构造函数,ModelAndView(String viewName, String modelName, Object modelObject)。所以根据 JavaDoc 我必须指定一个 modelName 但我该如何在客户端处理这个?

现在,如果我在以下代码中使用名为 Messages 的类,则客户端没有收到以下响应:

ObjectMapper mapper = new ObjectMapper(); 
            Object obj =  mapper.readValue(httpGetRequest.getResponse(), Object.class);
            if (obj instanceof Messages) {
              Messages m = (Messages) obj;
              for (String s : m.getMessages())
                  System.out.println("Here " + s);


            }

Messages 是一个实用程序类:

public class Messages {

private List<String> messages;

public Messages() { 
    messages = new ArrayList<String>();
}

现在使用控制器方法:

@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)

@ResponseBody 公共字符串 getPerson(@PathVariable("personId") String personId) {

logger.info(RestController.class.getName() + ".getPerson() method called."); 

Person person = personService.get(Integer.parseInt(personId));

ObjectMapper mapper = new ObjectMapper();
try {
    Messages m = new Messages();
    m.addMessage("SDGSFGSDFGSDFASDG");
    return mapper.writeValueAsString(m);
    // return mapper.writeValueAsString(person);
}
catch (JsonProcessingException ex) {

        return null;
 }

}

记录客户端,我得到:

Sending Get request: http://localhost:8080/Library/rest/person/1.

接收响应代码:200。 {消息=[SDGSFGSDFGSDFASDG]}

【问题讨论】:

  • 您需要在客户端使用 ${person}(JSP 或 HTML)
  • 听起来不错,但这是来自程序的 HTTP GET,到目前为止,我不知道如何按照您在这种情况下的建议进行操作。
  • 您是否在 JSP 上编写了 scriptlet 代码来读取此人?
  • 没有 JSP。 REST 正在发出请求。
  • 我猜你的 GET 调用中没有重定向。您只想返回一个类型为 Person 的对象

标签: java http spring-mvc get


【解决方案1】:

如果您的 GET 调用没有重定向,请尝试以下操作:

@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)
@ResponseBody
public String getPerson(@PathVariable("personId") String personId) {

    logger.info(RestController.class.getName() + ".getPerson() method called."); 

    Person person = personService.get(Integer.parseInt(personId));

    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(person);

}

确保Messages 类也是 POJO

public class Messages implements Serializable{

private List<String> messages;

//setters and getters for messages

}

【讨论】:

  • 这对 Person 有效,但如果我尝试另一个类,我不会得到上述输出。
  • 确保 Messages 是一个 POJO,具有 Java 标准定义的私有字段和适当的 setter 和 getter。
  • 您的读者正在阅读 Object 而不是 Messages。这是为什么?您还为PersonMessages 使用了相同的控制器映射
  • 我正在尝试执行以下操作:当一个方法必须通过 REST 返回验证消息时,我希望该方法返回 Messages 对象,但如果一切正常,它应该返回一个 Person。
  • 在这种情况下,您需要 implements Serializable 对应 Messages
猜你喜欢
  • 2017-01-05
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多