2017-03-20 5 views
3

私は、Angular 2アプリケーションでデータベースに新しい行を挿入する際に問題があります。スプリングレスト(角度2)

データベースの別のテーブルに外部キーを持つデータベースに新しいエントリを挿入しようとすると、問題が発生します。春に定義されている私の二つのモデルがあります:バックエンドで

@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; 
    ... 
} 

これら2つのモデルはフロントエンドでの対応を持っています。

export class A{ 
    id: number; 

    b: B[]; 

    _links:{...} 
    ... 
} 

export class B{ 
    id: number; 

    a: A; 

    _links:{...} 
    ... 
} 

私はAPIから何を得る情報に基づいてこれらのモデルを作成しました:春のREST APIが代わりに外部キーのリンクを提供しますので、私は_links部分を追加しました。たとえば、ローカルホスト上のGETリクエスト:8080/API/B/1が与えられる:

{ 
    "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" 
    } 
    } 
} 

私は簡単に私の角度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')); 
    } 

春の私のリポジトリは以下のように定義されています。

@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>{ 
} 

春の私のリポジトリの構成は次のとおりです。

@Configuration 
public class MyRestConfiguration extends RepositoryRestMvcConfiguration{ 

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

私は春に次のエラーを取得するテーブルBに新しい行を挿入しよう:

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}'} 
] 

私は希望しますアプリケーションが新しい行Bをデータベースに挿入するためには、http post要求の要求ペイロードがどのようなものであるかを知る必要があります。どんな助けでも大歓迎です。

編集:私はこのマッピングで春の休憩のcontrolerをした

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

} 

私はこのペイロードを持つHTTP POSTリクエストを行った場合(使用してカールまたはいくつかの他の手段ではなく、thatsのポイント):

{ 
    id:1, 
    aId:1 
} 

またはこのいずれか

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

かさえ、この1:

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

オブジェクトbのプロパティaが正しく初期化されていない/ nullに残っています。

+0

私は「援助について少し混乱しています'部分。それはあなたの角度の実装に反映されていますか?また、残りのスタックトレースを追加できますか?おそらくクラスBの完全なモデルを追加しますか? – rob

+0

これは実際には「aid」です。基本的には、結合は表aの列IDで行われるべきであることを示します。データベーステーブルBには、a_idと呼ばれる新しい列があり、そこには外部キーが置かれます。スタックトレースの残りの部分はここに貼り付けられます:http://pastebin.com/raw/6KyM63Ux – Kenan

+0

私は認識していますそれ。しかし、私には、この正確な振る舞いがあなたの角度の実装に反映されていないように見えます。したがって、BオブジェクトのaIdプロパティはnullです。あなたはあなたのクライアント側のbに接続されているコードを表示できますか? – rob

答えて