Javascript http在PUT请求中发送空值(Angular+;spring jpa应用程序)
因此,我有一个简单的spring jpa rest应用程序。部署在heroku中的api的结构与此类似:Javascript http在PUT请求中发送空值(Angular+;spring jpa应用程序),javascript,angular,spring,api,postman,Javascript,Angular,Spring,Api,Postman,因此,我有一个简单的spring jpa rest应用程序。部署在heroku中的api的结构与此类似: public Expert updateExpert(Expert expert) { Expert updatedExpert = manager.find(Expert.class, expert.getId()); updatedExpert.setName(expert.getName()); updatedExpert.set
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;
}
}
[{“id”:1,“姓名”:“jose”,“姓氏”:“garcia”,“dni”:“地址”:“邮件”:“eve”。holt@reqres.in“,”电话“:”650264663“,”linkedln“:”OJSKDOFWA“,”状态“:”评级“:”可用性“:”标签“:[{“id”:1,“名称”:“php”},{“id”:1,“名称”:“php”}”
所以我想允许用户在用户标签字段中添加标签。我使用一个PUT请求,在req正文中发送整个形式的用户,并添加新闻标签
这就是我如何使用reactiveform获取新标签并推送给专家的方式:
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');
}
}
)}
@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
expert的console.log看起来不错,红色是用户已经拥有的标签。蓝色是我尝试插入的内容:
我在专家服务中更新的方法:
updateExpert(expert){
return this.http.put('https://serene-wave-12377.herokuapp.com/api/experts', expert);
调用返回OK响应,但当我转到API时,我看到:
[{“id”:1,“姓名”:“jose”,“姓氏”:“garcia”,“dni”:“地址”:“邮件”:“eve”。holt@reqres.in“,”电话“:”650264663“,”linkedln“:”状态“:”评级“:”可用性“:”标签“:[{”id“:1,“名称“:”php“},{”id“:1,“名称“:”php“},{”id“:1,“名称“:”php“},{”id“:2,“名称“:”c++“},{”id“:”2,“名称“:”c++”},{”id“:”2,“名称“:”c++”},{“c++”},{“id”:3,“名称”:null},{“id”:4,“名称”:null},{“id”:5,“名称”:null},{“id”:6,“名称”:null},{“id”:7,“名称”:null},{“id”:8,“名称”:null}]
它似乎在添加标记并生成更多ID,但名称为空
在我的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,它也总是插入空值。专家和标记有多对多关系。这是我的专家和标记模型。除了标记字段,所有字段都插入正常 专家模型:
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');
}
}
)}
@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
@实体
@表(name=“专家”)
公开课专家{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
私家姓;
私有字符串dni;
私有字符串地址;
私人字符串邮件;
私人电话;
私有字符串链接;
私有字符串状态;
私人字符串评级;
私有字符串可用性;
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.PERSIST})
@可接合(
name=“专家标签”,
joinColumns={@JoinColumn(name=“tags\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“experts\u id”,referencedColumnName=“id”)}
)
private List tags=new ArrayList();
公共专家(){
}
公共专家(字符串名称、字符串姓氏、字符串dni、字符串地址、字符串邮件、字符串电话、字符串链接DN、字符串状态、字符串评级、列表标签、字符串可用性){
this.name=名称;
this.姓氏=姓氏;
this.dni=dni;
this.address=地址;
this.mail=邮件;
this.phone=电话;
this.linkedln=linkedln;
this.state=状态;
这个。评级=评级;
this.tags=标签;
这个。可用性=可用性;
}//getter和setter
标签型号:
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');
}
}
)}
@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
@实体
@表(name=“tags”)
公共类标签{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
@多个(mappedBy=“标记”)
私有列表专家=新的ArrayList();
公共标签(){
}//getter和setter
请共享您的专家和标记类。这可能是因为模型不正确