【问题标题】:http sending nulls in PUT Request (Angular + spring jpa app)http 在 PUT 请求中发送空值(Angular + spring jpa 应用程序)
【发布时间】:2021-07-15 09:16:34
【问题描述】:

所以我有一个简单的带有 angular 的 spring jpa rest 应用程序。我在 heroku 中部署的 api 具有类似这样的结构:

[{"id":1,"name":"jose","surname":"garcia","dni":"","address":"","mail":"eve.holt@ reqres.in","phone":"650264663","linkedln":"ojskdfofwa","state":"","rating":"","availability":"","tags":[{"id ":1,"name":"php"},{"id":1,"name":"php"}

所以 id 喜欢允许用户在用户标签字段中添加标签。我为此使用了一个 PUT 请求,它在 req 正文中发送整个用户形式,并添加了新闻标签。

这就是我使用反应形式获取新标签并推送给专家的方式:

expertdetail.ts:

  constructor( private formBuilder: FormBuilder,private router: Router, private expertService: ExpertsService) {this.expert= this.router?.getCurrentNavigation().extras.state.expert;
  }

  ngOnInit(): void {
    this.formGroup = this.formBuilder.group({
      tags: this.formBuilder.array([])

    });



  }
  get tagsArray(): FormArray{
    return this.formGroup.get('tags') as FormArray
  }

  addTag() {

    const tags = this.formBuilder.group(
      {
        name: ['', Validators.compose([Validators.required, Validators.minLength(2), Validators.maxLength(2)])]
      }
    );
    this.tagsArray.push(tags);
     
     this.expert.tags.push(this.formGroup.value)
     this.expertService.updateExpert(this.expert).subscribe((response) => {
      if(response){
       alert('etiqueta añadida con exito');
       }else{
        alert('Error: No Token Received');
      }
     }


     )}

专家的console.log好像没问题,红色是用户已经拥有的标签。我尝试插入的蓝色:

我在专家服务中的更新方法:

 updateExpert(expert){
    return this.http.put('https://serene-wave-12377.herokuapp.com/api/experts', expert);

调用返回一个 OK 响应,但是当我转到我的 API 时,我看到了:

[{"id":1,"name":"jose","surname":"garcia","dni":"","address":"","mail":"eve.holt@ reqres.in","phone":"650264663","linkedln":"","state":"","rating":"","availability":"","tags":[{"id" :1,"name":"php"},{"id":1,"name":"php"},{"id":1,"name":"php"},{"id":1 ,"name":"php"},{"id":2,"name":"c++"},{"id":2,"name":"c++"},{"id":2," name":"c++"},{"id":2,"name":"c++"},{"id":3,"name":null},{"id":4,"name":null },{"id":5,"name":null},{"id":6,"name":null},{"id":7,"name":null},{"id":8 ,"名称":null}]}]

好像是在添加标签,生成更多的IDS,但是name是空的。

在我的 Spring JPA 中,我这样更新:

    public Expert updateExpert(Expert expert) {
        Expert updatedExpert = manager.find(Expert.class, expert.getId());
        updatedExpert.setName(expert.getName());
        updatedExpert.setMail(expert.getMail());
        updatedExpert.setSurname(expert.getSurname());
        updatedExpert.setPhone(expert.getPhone());
        updatedExpert.setAvailability(expert.getAvailability());
        updatedExpert.setAddress(expert.getAddress());
        updatedExpert.setDni(expert.getDni());
        updatedExpert.setLinkedln(expert.getLinkedln());
        updatedExpert.setRating(expert.getRating());
        updatedExpert.setState(expert.getState());
        updatedExpert.getTags().addAll(expert.getTags());
        manager.merge(updatedExpert);
        return updatedExpert;
    }
}

有人知道吗?我尝试了更多组合,但似乎没有任何效果。我已经尝试过使用 Postman,它也总是插入空值。专家和标签是多对多的关系。

【问题讨论】:

  • 请分享您的专家和标签课程。这可能是因为模型不合适

标签: javascript angular spring api postman


【解决方案1】:

这是我的专家和标签模型。除标签字段外,所有字段均插入正常

专家模型:

@Entity
@Table(name="experts")
public class Expert {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String surname;
    private String dni;
    private String address;
    private String mail;
    private String phone;
    private String linkedln;
    private String state;
    private String rating;
    private String availability;



    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST})
    @JoinTable(
            name = "experts_tags",
            joinColumns = {@JoinColumn(name="tags_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name="experts_id", referencedColumnName = "id")}
    )
    private List<Tag> tags = new ArrayList<>();


    public Expert() {
    }

    public Expert(String name, String surname, String dni, String address, String mail, String phone, String linkedln, String state, String rating, List<Tag> tags, String availability) {
        this.name = name;
        this.surname = surname;
        this.dni = dni;
        this.address = address;
        this.mail = mail;
        this.phone = phone;
        this.linkedln = linkedln;
        this.state = state;
        this.rating = rating;
        this.tags = tags;
        this.availability = availability;
    } //getters and setters

标签模型:

@Entity
@Table(name="tags")
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @ManyToMany(mappedBy="tags")
    private List<Expert> experts = new ArrayList<>();

    public Tag() {
    }  //getters and setters

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-25
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多