2017-02-24 4 views
0

私のプロジェクトではJPARepositoryフレームワークを使用しているため、クライアントとサーバー間で送信されるデータに実際に何が起こるかを見るためにデバッグする能力が制限されています。したがって、私は現在の問題を追跡するのが難しいです。JSONでリンクのSet <>をPOSTまたはPUTするにはどうすればよいですか?

私は、他のクラスとManyToMany関係を含むクラスを持っています。ビジュアル・パラダイム・ツールは、これらの2つのエンティティー間に自動的にアソシエーション・テーブルを生成しますが、そのアソシエーション・テーブルに対してJavaコードは生成されず、そのテーブルへの直接要求に対してはリポジトリーは作成されません。私は現在RestConsoleでクラスをテストして、クライアントとサーバーの間を通過する正確なJSONを判断しています。具体的には、クラスで私はここで、と苦労宣言です:私は投稿したり、そのデータを保存するためにデータを置くとき

@ManyToMany(mappedBy="provider", targetEntity=location.ServiceCoreType.class) 
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK}) 
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.TRUE) 
private java.util.Set<location.ServiceCoreType> srvcCoreType = new java.util.HashSet<location.ServiceCoreType>(); 

他のクラスには、リンクされたクラスのための私のJSONを他のクラスとの関係をManyToOne、としています

"srvcCoreType" : [ "http://localhost:8080/enums_servicecore/2", "http://localhost:8080/enums_servicecore/3" ] 

"facility" : "http://localhost:8080/enums_facility/2" 

は、私は最後の2年前にこのプロジェクトに取り組んとき、私は、オブジェクトのセット<>のために、私はのようなものを必要なことを思い出し:ように見えますしかし、私がPOSTでそれを使用したとき、そのデータは無視されたように見えました。アソシエーションテーブルにはエントリがありません)、残りのアイテムはデータベースに作成されました。私はPUTを行うと、私はエラーを取得する:

{"error":"Can not construct instance of location.ServiceCoreType: no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/enums_servicecore/2')\n at [Source: N/A; line: -1, column: -1]"} 

は、私はここで何をしないのですか?プロバイダにコアタイプをリンクするようにサーバーに指示するにはどうすればよいですか?

更新: VPのモデルで問題が発生している可能性があることが判明しました。問題の関係に異なるコードが生成されたためです。私は、その関係のために元のコードとそのコードを置き換える:

@ManyToMany(targetEntity=com.comporium.domain.location.ServiceCoreType.class) 
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.ALL}) 
@JoinTable(name="ComporiumProvider_ServiceCoreType", joinColumns={ @JoinColumn(name="ComporiumProviderID") }, inverseJoinColumns={ @JoinColumn(name="ServiceCoreTypeId") }) 
@org.hibernate.annotations.LazyCollection(org.hibernate.annotations.LazyCollectionOption.TRUE) 
private java.util.Set<location.ServiceCoreType> srvcCoreType = new java.util.HashSet<location.ServiceCoreType>(); 

私は今、このデータを投稿することができます:

{ 
    "id" : 98, 
    "deleted" : "false", 
    "description": "leaver", 
    "modifiedBy" : "Fred" , 
    "name" : "Emca",  
    "srvcCoreType" : [ "http://localhost:8080/enums_servicecore/2" , "http://localhost:8080/enums_servicecore/3" ] 
} 

、これが関連テーブルに2つのリンクを作成します。成功!

そうでないかもしれません。私は1つまたは2つの異なるリンクでPUTまたはPASTEを行うことができ、すべてが期待通りに機能します。しかし、私は現在存在してより多くのリンクをPUTまたはペーストしようとすると、私は次のエラーを取得する:プロバイダは任意のリンクなしで作成された場合

{"error":"Can not construct instance of com.comporium.domain.location.ServiceCoreType: no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/enums_servicecore/2')\n at [Source: N/A; line: -1, column: -1]"} 

ので、任意の新しいリンクを作成する方法はありません、と新しいリンクを追加することは不可能です。これはHibernateの問題かもしれません、もしそうなら、Hibernateの旗がこの問題を解決するでしょうか。 (私はこれに支障はないかどうかは分かりませんが、元のコードはエラーなしで実行されます - リンクを作成したり更新したりしていない間は、現在のリンクよりも多くのリンクを貼り付けたり貼り付けたりしてください。どのようにして@JoinTableアノテーションなしで何個存在するのか、またそのテーブルを知っている場合、なぜそれらの行を更新しないのですか?)

UPDATE 2: 問題を引き起こす可能性があるものを見つけました。この機能は、古いバージョンのプロダクションで正しく動作します。

ProductionはSpringブートv1.2.8.RELEASE/Hibernate v4、spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.DefaultNamingStrategyで構成されています。

私の現在の開発は、spring.jpa.hibernate.naming.physical-strategy = org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImplのSpringブートv1.4.3.RELEASE/Hibernate v5にあります。

これは、新しいリンクを追加できないという問題を示していますか?

答えて

0

解決策は簡単であることが判明しました。 ServiceCoreTypeクラスでは、空のコンストラクタを追加しました。

public ServiceCoreType(String json) { } 

webserviceが期待どおりに機能するようになりました。私はリンクの数を増やす場合にこれを必要とするカーテンの背後にあるフレームワークを正確にはわかりませんが、POST、PUT、PATCHの望ましい結果が得られます。

関連する問題