java - 从另一个服务调用 Rest 服务以使用 spring 引导进行类(class)注册系统

标签 java rest api spring-boot microservices

我试图从我的Registration微服务中调用REST(Student, Course微服务)用于插入新注册的服务,但每当我调用这些服务时,Student 微服务都会显示以下错误

> org.springframework.web.client.RestClientException: Error while extracting response for type [class com.homeexam.registrationmanagementserver.model.Student] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.homeexam.registrationmanagementserver.model.Student` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.homeexam.registrationmanagementserver.model.Student` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]

我尽力解决了从谷歌搜索的问题,但我找不到与该问题相关的任何解决方案。帮帮我!

这是我的 RegistrationService 类,我在其中调用这些微服务:

    public Registration create(Registration registration) {

            Student student = restTemplate.getForObject(studentsUrl, Student.class);
            Section section = restTemplate.getForObject(sectionsUrl, Section.class);
            Course course = restTemplate.getForObject(coursesUrl, Course.class);


            /*registration = new Registration(registration.getId(), student.getId(),student.getProgram(),
                    section.getSectionNumber(),course.getCourseCode(),section.getFacultyInitial());*/
            registration.setId(registration.getId());
            registration.setStudentId(student.getId());
            registration.setProgramName(student.getProgram());
            registration.setCourseCode(course.getCourseCode());
            registration.setFacultyInitial(section.getFacultyInitial());
            registration.setSectionNumber(section.getSectionNumber());

            Optional<Registration> optionalReg = registrationRepository.findById(registration.getId());
            Optional<Registration> byCourseCode = registrationRepository.findById(Integer.valueOf(registration.getCourseCode()));
            if (optionalReg.isPresent() ) {
                throw new ResourceAlreadyExistsException();
            } else if (byCourseCode.isPresent())
               throw new AlreadyRegisteredException();
            else {
               return registrationRepository.save(registration);
            }
        }

但是,代码确实可以在不调用微服务相关信息的情况下工作。

注册 JSON

{
  "courseCode": "string",
  "facultyInitial": "string",
  "id": 0,
  "programName": "string",
  "sectionNumber": 0,
  "studentId": "string"
}

学生 JSON

{
    "id": "201600000001",
    "name": "UML Diagram",
    "email": "uml@gmail.com",
    "address": "Texas,USA",
    "dob": "1998-09-11",
    "mobileNumber": "01110000000",
    "dateOfAdmission": "2018-09-10",
    "program": "BSc. in EEE",
    "role": "Student",
    "password": "1555"
  }

类(class) JSON

[
  {
    "courseCode": "CS193",
    "courseTitle": "Android Application",
    "courseCredit": 3,
    "sectionList": [
      {
        "id": 1,
        "sectionNumber": 1,
        "seatLimit": 25,
        "semesterNumber": 11,
        "facultyInitial": "ATA",
        "course": {
          "courseCode": "CS193",
          "courseTitle": "Android Application",
          "courseCredit": 3,
          "sectionList": null,
          "gradeList": null
        }
      },
      {
        "id": 2,
        "sectionNumber": 2,
        "seatLimit": 30,
        "semesterNumber": 11,
        "facultyInitial": "ABA",
        "course": {
          "courseCode": "CS193",
          "courseTitle": "Android Application",
          "courseCredit": 3,
          "sectionList": null,
          "gradeList": null
        }
      }
    ],
    "gradeList": null
  }
]

节 JSON

[
  {
    "id": 1,
    "sectionNumber": 1,
    "seatLimit": 25,
    "semesterNumber": 11,
    "facultyInitial": "ATA",
    "course": {
      "courseCode": "CS193",
      "courseTitle": "Android Application",
      "courseCredit": 3,
      "sectionList": null,
      "gradeList": null
    }
  },
  {
    "id": 2,
    "sectionNumber": 2,
    "seatLimit": 30,
    "semesterNumber": 11,
    "facultyInitial": "ABA",
    "course": {
      "courseCode": "CS193",
      "courseTitle": "Android Application",
      "courseCredit": 3,
      "sectionList": null,
      "gradeList": null
    }
  }
]

Student.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = {"id","name"})
@Document
public class Student {
    @Id
    private String id;
    private String name;
    private String email;
    private String address;
    private LocalDate dob;
    private String mobileNumber;
    private LocalDate dateOfAdmission;
    private String program;
    private Role role;
    private String password;
}

注册.java

public class Registration {
    @Id
    private int id;
    private String studentId;
    private String programName;
    private int sectionNumber;
    private String courseCode;
    private String facultyInitial;
}

最佳答案

该错误意味着您向需要单个对象的服务发送了一个数组。

解决方案:要么为每个请求发送单个 JSON 对象,要么更改服务以使其接受数组或列表。

关于java - 从另一个服务调用 Rest 服务以使用 spring 引导进行类(class)注册系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58084819/

相关文章:

c# - WCF JSON 反序列化中的空格问题

java - 从自定义模型生成 Java 类

ios - React Native api 调用不会在远程 Debug模式之外发生(仅限 iOS)

java - Google 搜索结果计数为 10000 个术语

android - retrofit - I/art : Background sticky concurrent mark sweep GC freed

java - Swagger 2 相对于 Swagger 增加了哪些内容?

json - 如何从instagram实时发布数据中获取实际照片?

java - 如何正确解码基于模式的请求结果(即 xwiki)?

java - 输出排序算法

java - 创建多个文件目录