gpt4 book ai didi

使用 Angular 2 进行 Spring 休息

转载 作者:行者123 更新时间:2023-12-02 11:34:46 25 4
gpt4 key购买 nike

我在使用 Angular 2 应用程序将新行插入数据库时​​遇到问题。

当我尝试在数据库中插入一个新条目,该条目具有指向数据库中另一个表的外键时,就会出现问题。我在 Spring 中定义的两个模型是:

@Entity
public class A{

@Id
@NotNull
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@OneToMany(mappedBy = "A")
private List<B> b = new ArrayList<B>();
...
}

@Entity
public class B{

@Id
@NotNull
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@NotNull
@ManyToOne
@JoinColumn(name="aId")
private A a;
...
}

后端的这两个模型在前端也有对应的模型。我添加了 _links 部分,因为 Spring Rest api 提供链接而不是外键:

export class A{
id: number;

b: B[];

_links:{...}
...
}

export class B{
id: number;

a: A;

_links:{...}
...
}

我根据从 api 获得的信息创建了这些模型。例如,localhost:8080/api/b/1 上的 get 请求给出:

{
"id" : 1,
"_links" : {
"self" : {
"href" : "http://localhost:4200/api/b/1"
},
"b" : {
"href" : "http://localhost:4200/api/b/1"
},
"a" : {
"href" : "http://localhost:4200/api/b/1/a"
}
}
}

我可以使用如下所示的 Angular 2 服务方法轻松地将新行插入表 A(因为它不包含外键):

  createA(a: A): Observable<A[]>{
return this.http.post(this.AUrl, a)
.map((res:Response) => res.json())
.catch((error:any) => Observable.throw(error.json().error || 'Server Error'));
}

同样,创建新模型 B 的服务方法如下所示:

  createB(b: B): Observable<B[]>{
return this.http.post(this.BUrl, b)
.map((res:Response) => res.json())
.catch((error:any) => Observable.throw(error.json().error || 'Server Error'));
}

我在 Spring 中的存储库定义为:

@RepositoryRestResource(collectionResourceRel="a", path="a", itemResourceRel="a")
public interface ARepository extends JpaRepository<A, Integer>{
}

@RepositoryRestResource(collectionResourceRel="b", path="b", itemResourceRel="b"))
public interface BRepository extends JpaRepository<B, Long>{
}

我在 Spring 中的存储库配置是:

  @Configuration
public class MyRestConfiguration extends RepositoryRestMvcConfiguration{

@Override
protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config){
config.setBasePath("/api");
config.exposeIdsFor(A.class);
config.exposeIdsFor(B.class);
}
}

当我尝试将新行插入表 B 时,我在 spring 中收到以下错误:

javax.validation.ConstraintViolationException: Validation failed for classes [......model.B] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='may not be null', propertyPath=a, rootBeanClass=class ........model.B, messageTemplate='{javax.validation.constraints.NotNull.message}'}
]

我想知道 http post 请求的请求负载到底是什么样的,以便应用程序将新的 B 行插入数据库。非常感谢任何帮助。

编辑:

我用这个映射制作了一个 Spring 支架 Controller :

@PostMapping("/api/b")
@ResponseBody
public String createServis(@RequestBody B b){

}

如果我使用此有效负载发出http post请求(使用curl或通过其他方式,但这不是重点):

{
id:1,
aId:1
}

或者这个:

{
id:1,
a:{id:1}
}

甚至这个:

{
id:1,
aId:1,
a:{id:1}
}

对象 b 的属性 a 仍然为 null/未正确初始化。

最佳答案

我在这里得到了答案Spring Rest: Cannot insert rows that have @ManyToOne column

基本上你需要发布:

{
id: 1
a: "http://localhost:4200/api/a/1"
}

到 url localhost:4200/api/b

关于使用 Angular 2 进行 Spring 休息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com