【发布时间】: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