我在服务器上(使用Spring Data REST构建)具有/studentCourses端点,该端点返回以下内容:

{
  "_embedded" : {
    "studentCourses" : [
      {
        "uid" : "5f23abe9-b24e-4e76-86b0-d539950a0a41",
        "registrationDate" : "7/23/2016",
        "_links" : {
          "self" : {
            "href" : "http://localhost:8080/studentCourses/5f23abe9-b24e-4e76-86b0-d539950a0a41"
          },
          "studentCourse" : {
            "href" : "http://localhost:8080/studentCourses/5f23abe9-b24e-4e76-86b0-d539950a0a41"
          },
          "course" : {
            "href" : "http://localhost:8080/studentCourses/5f23abe9-b24e-4e76-86b0-d539950a0a41/course"
          },
          "student" : {
            "href" : "http://localhost:8080/studentCourses/5f23abe9-b24e-4e76-86b0-d539950a0a41/student"
          }
        }
      },
      {
        ...
      },
      ...
    ]
  },
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/studentCourses"
    },
    "profile" : {
      "href" : "http://localhost:8080/profile/studentCourses"
    }
  },
  "page" : {
    ...
  }
}


以及以下客户端代码:

class StudentCourseDTO {

    String uuid;

    String registrationDate;

    StudentDTO student; // contains uuid, firstName, lastName, etc.

    CourseDTO course; // contains uuid, name, etc.

    // getters, setters

}

RestTemplate restTemplate() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new Jackson2HalModule());
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    MappingJackson2HttpMessageConverter messageConverter =
            new MappingJackson2HttpMessageConverter();
    messageConverter.setObjectMapper(objectMapper);
    messageConverter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON));
    return new RestTemplate(Arrays.asList(messageConverter));
}

...

Collection<StudentCourseDTO> studentCourses = restTemplate().exchange(
        "http://localhost:8080/studentCourses",
        HttpMethod.GET, null,
        new ParameterizedTypeReference<PagedResources<StudentCourseDTO>>() {})
        .getBody().getContent();


问题是StudentCourseDTO.studentStudentCourseDTO.course始终是null,但是StudentCourseDTO.uuidStudentCourseDTO.registrationDate是从服务器正确检索的。
有人知道我错过了什么吗?
我认为必须有某种方式告诉RestTemplate自动跟踪返回的内容中的链接,例如上例中的studentcourse,但是我还没有找到一种方法。

最佳答案

仅因为存在链接并不意味着它们会自动被关注。

我将StudentCourseDTO更改为:

class StudentCourseDTO {

    String uuid;

    String registrationDate;

}


然后您将反序列化对

PagedResources<Resource<StudentCourseDTO>> studentCourses = restTemplate().exchange(
        "http://localhost:8080/studentCourses",
        HttpMethod.GET, null,
        new ParameterizedTypeReference<PagedResources<Resource<StudentCourseDTO>>>() {})
        .getBody().getContent();


然后,对于每个Resource<StudentCourseDTO>,您都可以点击studentcourse的链接,例如通过使用RestTemplate检索资源。

当然,这会给每个响应项两个额外的调用-但是避免这种情况的唯一方法是更改​​服务以将该信息嵌入到列表资源中。

10-07 18:05