2017-06-08 2 views
1

これは、Spring-Roo 2.0でJSONをRESTfulなWebサービス呼び出しから戻している問題の簡単な例です。以下は、2つのクラス(会社とユーザー)のRooスクリプト、ユーザーがcompany_id = 1に関連していることを示すデータベースのコンテンツ、JSONはユーザーのGETに戻っています。 company = nullであることに注意してください。それが問題です。私は何か間違っているのですか?Spring-Roo 2.0では、取得したJSONはオブジェクト間の関係を表示しません。

Rooのスクリプト

jpa setup --provider HIBERNATE --database MYSQL 
--userName pivot --password pivot --databaseName testdb 

entity jpa --class ~.model.MyUser 
field string --fieldName firstName --notNull 
field string --fieldName lastName --notNull 

entity jpa --class ~.model.Company 
field string --fieldName name –notNull 

field set --fieldName users --type ~.model.MyUser --cardinality ONE_TO_MANY 
     --mappedBy company --comment "Users" --notNull false 

repository jpa --all --package ~.repository 
service --all --apiPackage ~.service.api --implPackage ~.service.impl 
web mvc setup 

/* ThymeLeaf view layer */ 
web mvc view setup --type THYMELEAF 
web mvc templates setup --type THYMELEAF 
web mvc controller --all --package ~.web --responseType THYMELEAF 

/* JSON Rest controllers */ 
web mvc controller --all --responseType JSON --pathPrefix /json 

web mvc finder --all --responseType THYMELEAF 
web mvc finder --all --responseType JSON 

データベース

mysql> select * from my_user; 
+----+------------+-----------+---------+------------+ 
| id | first_name | last_name | version | company_id | 
+----+------------+-----------+---------+------------+ 
| 1 | First  | Last  |  0 |   1 | 
+----+------------+-----------+---------+------------+ 
1 row in set (0.00 sec) 

JSON

{ 
    "content": [ 
     { 
      "id": 1,  
      "version": 0, 
      "firstName": "First", 
      "lastName": "Last", 
      "company": null 
     } 
    ], 
    "last": true, 
    "totalPages": 1, 
    "totalElements": 1, 
    "size": 20, 
    "number": 0, 
    "first": true, 
    "numberOfElements": 1, 
    "sort": null 
} 

答えて

2

春Rooの2.0によって生成された関係は、データの過負荷を防ぐために、デフォルトでレイジーとしてsettedされています。 Spring Rooはベストプラクティスを可能な限り適用しようとしています。あなたはMyUser.javaエンティティでこれを見ることができる:あなたがMyUserエンティティのすべてのレコードを取得する際に

@ManyToOne(fetch = FetchType.LAZY) 
@EntityFormat 
private Company company; 

ので、とびとの関係は、デフォルトではロードされません。

ただし、この情報を取得することがわかっている場合は、生成されたコードをSpring Rooでカスタマイズする必要があります。次の手順に従います。

findAllMyUserRepositoryImplクラスで宣言します。 、その後

push-in --class ~.repository.MyUserRepositoryImpl --method findAll(GlobalSearch,Pageable) 

MyUserRepositoryImpl.javaクラスを開き、左側がCompanyと結合を実行するデフォルトのクエリを変更します。これを行うには、次のコマンドを実行します。これと

JPQLQuery<MyUser> query = from(myUser); 

::、この生成されたコードに変更することを行うには

JPQLQuery<MyUser> query = from(myUser).leftJoin(myUser.company).fetchJoin(); 

すると、個々の項目の代わりのリストを取得しようとするときに使用されるfindOne方法で処理を繰り返します。この場合、MyUserRepositoryCustomインターフェイスでfindOneメソッドを定義し、その後、MyUserRepositoryImplのQueryDSLを使用してメソッドを実装する必要があります。上記の変更により

、あなたはGET操作使用してURL http://localhost:8080/json/myusers/にアクセスもする場合は、次のJSONを取得することができるはずです。アドバイスとして

{ 
    "content": [ 
    { 
     "id": 1, 
     "version": 0, 
     "firstName": "test", 
     "lastName": "test", 
     "company": { 
     "id": 1, 
     "version": 0, 
     "name": "aaa" 
     } 
    } 
    ], 
    "last": true, 
    "totalPages": 1, 
    "totalElements": 1, 
    "sort": null, 
    "numberOfElements": 1, 
    "first": true, 
    "size": 20, 
    "number": 0 
} 

を、私はあなたがたときに注意しなければならないことを言わなければなりませんJSONレスポンスで関係のあるエンティティを使用します。あるエンティティが最初のエンティティと関連する他のエンティティと関連していると、循環的な関係が得られる可能性があります。 JSONレスポンスで完全なエンティティを返す代わりに、エンティティプロジェクションを返すと、関連するエンティティ全体ではなく関連する要素の識別子のみが表示されます。

希望します。

+0

これは大いに役立ちます。ありがとうございました!私もサイクリック関係の問題に遭遇しました。その質問に事前に回答してくれてありがとう。 – Patrick

+0

この回答が役立つ場合は、妥当性を確認して投票してください! ;)よろしく – jcgarcia

関連する問題