【问题标题】:Matching Javascript Array to Java list将 Javascript 数组与 Java 列表匹配
【发布时间】:2023-03-08 09:10:01
【问题描述】:

我正在从前端 (Angular) 向后端 (Java) 发出 POST 请求。发布请求作为 JSON 对象(由多个数组组成)发送,在 Java 中,应该与数组打算作为列表的对象匹配。这是一个表示问题的示例代码,因为这不是实际代码,因为它属于工作并且不希望有任何机密性问题,所以这只是为了尽可能接近原始代码来表示问题(值得注意的是,有很多存储的学校,并且为了论证,他们可以由他们的学生和所教授的课程唯一标识,并使用此信息,我们希望获得该学校的教室):

Angular 服务 api 调用:

getSchool(students, lessons): Promise<School> {
  return this.http.post('sampleurl/classroom', JSON.stringify({students:students, lessonsTaught:lessons}), {headers:this.headers})
  .toPromise()
  .then(res => <School>res.json())
  .catch(this.handleError);
}

Angular School 模型:

export class School {
  public students:any;
  public lessonsTaught:string[];
  public classrooms:string[];

  constructor() {}
}

Java 学校对象:

public class School {
  private List<Student> students;
  private List<String> lessonsTaught;
  private List<String> classrooms;

  public School() {}
  
  public List<Student> getStudents() {
    return students;
  }

  public void setStudents(List<Student> students) {
    students = this.students;
  }

  public List<Stream> getLessonsTaught() {
    return students;
  }

  public void setLessonsTaught(List<String> lessonsTaught) {
    lessonsTaught = this.lessonsTaught;
  }

  public List<String> getClassrooms() {
    return classrooms;
  }

  public void setClassroom(List<String> classroom) {
    classroom = this.classroom;
  }

Java SearchSchool 对象:

public class SearchSchool {
  private List<String> students;
  private List<String> lessonsTaught;

  public School() {}
  
  public List<Student> getStudents() {
    return students;
  }

  public void setStudents(List<Student> students) {
    students = this.students;
  }

  public List<Stream> getLessonsTaught() {
    return students;
  }

  public void setLessonsTaught(List<String> lessonsTaught) {
    lessonsTaught = this.lessonsTaught;
  }

Java 端点:

@RequestMapping(value="sampleurl/classroom", method = RequestMethod.POST)
public School(@RequestBody SearchSchool searchSchool) {
  return service.getSchool(searchSchool);
}

如此有效,我使用 Java 中的 SearchSchool 对象来唯一标识学校并将其返回。但是,传递到端点的数组似乎与 SearchSchool 对象所需的列表不匹配(我在端点的条目上放置了一个断点,它甚至没有被执行)。稍微玩了一下代码,Angular 中学生的字符串数组与 Java 中学生的字符串列表的匹配似乎工作正常,问题似乎是将教授的课程数组与教授的课程列表相匹配在 Chrome 中的开发者控制台中给我以下运行时错误:

An error occurred syntaxError: service.ts: 163
Unexpected token A in JSON at position o
at JSON.parse (<anonymous>)
at Response.Body.json (http.ess.js:796)
at duration service.ts:54
at ZoneDelegate.invoke (zone.js:365)
at object.onInvoke (core.ess.js:4145)
at ZoneDelegate.invoke (zone.js:364)
at zone.run (zone.js:125)
at zone.js:760
at ZoneDelegate.invokeTask (zone.js:398)
at object.on InvokeTask (core.ess.js:4136)
at ZoneDelegate.invokeTask (zone.js:397)
at Zone.runTask (zone.js:165)
at drainMicroTaskQueue (zone.js:593)
at XMLHttpRequest. ZoneTask.invoke (zone.js:464)

和:

ERROR Error: Uncaught (in promise): core.es5.js:1085
Unexpected token A in JSON at position o
at resolvePromise (zone.js:683) [angular]
at :8080/gar-app/polyfis:7034:17 [angular)
at object.onInvokeTask (core.ess.js:4136) [angular]

有谁知道为什么从前端的数组匹配到后端的列表会导致这样的问题?

【问题讨论】:

  • 在浏览器控制台检查请求,是请求还是响应无效的json?
  • console.log res 在返回 &lt;School&gt;res.json() 之前。您的回复可能与您的预期不同
  • @luk2302 请求似乎根本不包含 JSON

标签: javascript java arrays json angular


【解决方案1】:

尝试传递一个对象而不是 JSON,只需删除 JSON.stringify()

getSchool(students, lessons): Promise<School> {
  return this.http.post('sampleurl/classroom', {students:students,lessonsTaught:lessons}, {headers:this.headers})
  .toPromise()
  .then(res => <School>res.json())
  .catch(this.handleError);
}

【讨论】:

    【解决方案2】:

    前后端字段名不匹配

    在前端,您正在通过课程,在后端,您正在期待课程学习

    修改任何一个以使代码工作

    更改后前端将如下所示

    getSchool(students, lessons): Promise<School> {
      return this.http.post('sampleurl/classroom', JSON.stringify({students:students, lessonsTaught:lessons}), {headers:this.headers})
      .toPromise()
      .then(res => <School>res.json())
      .catch(this.handleError);
    }
    
    

    【讨论】:

    • 不,这是JSON.parse 错误。 &lt;School&gt; 只是在编译时,不会抛出不匹配错误
    • 你是说端点没有命中对吗?
    • 不,我是说端点可能没有发送有效的 json 或者可能发送某种错误...
    • Angular 中的学生字符串数组与 Java 中的学生字符串列表的匹配似乎工作正常,并且问题似乎是将教授的课程数组与教授的课程列表相匹配 - 你可以尝试改变
    • Except.. 映射发生在 JSON.parse 之后,这就是引发错误的原因。无论哪种方式,OP 都需要指定返回什么 res
    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 2012-07-09
    • 2014-01-09
    • 2012-04-26
    • 2016-08-26
    • 2018-07-29
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多