1

仲間のSpring Data REST愛好家、私はSpring Data REST 1.1アプリケーションを実行しており、リンクで説明されているように、curlを使用して「text/uri-list」コンテンツタイプを使用してエンティティ関係を追加しようとしています: Example-API-使用法とカール

curl -v -d "http://localhost:8080/simplemvc/rest/enemies/3" -H "Content-Type: text/uri-list" http://localhost:8080/simplemvc/rest/heroes/1/defeatedEnemies

残念ながら、サーバーは「201 Created」を返しますが、本文には空の JSON オブジェクトが含まれており、エンティティ関係は作成されません。

{
  "links" : [ ],
  "content" : [ ]
}

SQL UPDATE が実行されることを期待しますが、SQL を分析すると、SELECT ステートメントのみが発生することがわかります。

Hibernate: select hero0_.HERO_ID as HERO1_1_0_, hero0_.name as name2_1_0_ from HERO hero0_ where hero0_.HERO_ID=?
Hibernate: select defeateden0_.HERO_ID as HERO4_1_1_, defeateden0_.ENEMY_ID as ENEMY1_0_1_, defeateden0_.ENEMY_ID as ENEMY1_0_0_, defeateden0_.description as descript2_0_0_, defeateden0_.HERO_ID as HERO4_0_0_, defeateden0_.name as name3_0_0_ from ENEMY defeateden0_ where defeateden0_.HERO_ID=?
Hibernate: select enemy0_.ENEMY_ID as ENEMY1_0_1_, enemy0_.description as descript2_0_1_, enemy0_.HERO_ID as HERO4_0_1_, enemy0_.name as name3_0_1_, hero1_.HERO_ID as HERO1_1_0_, hero1_.name as name2_1_0_ from ENEMY enemy0_ left outer join HERO hero1_ on enemy0_.HERO_ID=hero1_.HERO_ID where enemy0_.ENEMY_ID=?

興味深いことに、データベース クライアントで SQL ステートメントを実行してリレーションシップを「手動で」追加すると、次のようになります。

UPDATE ENEMY SET HERO_ID = 1 WHERE ENEMY_ID = 1;

次に、curl ステートメントを実行します。

curl -v -H "Accept: application/json" http://localhost:8080/simplemvc/rest/heroes/1/defeatedEnemies

ハイパーメディア リンクを介して、Spring Data REST が Hero エンティティと Enemy エンティティ間の 1 対多の関係を認識することを示す JSON 表現を取得します。

{
  "links" : [ ],
  "content" : [ {
    "name" : "Red Ghost",
    "description" : "Likes to chase",
    "links" : [ {
      "rel" : "self",
      "href" : "http://localhost:8080/simplemvc/rest/enemies/1"
    }, {
      "rel" : "enemy.enemy.hero",
      "href" : "http://localhost:8080/simplemvc/rest/enemies/1/hero"
    } ]
  } ]
}

これは、次の記事をガイドとして使用して、Spring Data REST が追加されている既存の Spring MVC アプリです

H2 データベースと MySQL データベースの両方を使用してみましたが、結果は同じでした。以下は、私の JPA エンティティ、Spring Data JPA リポジトリ、アプリケーション コンテキスト、および web.xml です。

Hero.java

@Entity
@Table(name = "HERO")
public class Hero {

    @TableGenerator(
            name="heroGen", 
            table="ID_GEN", 
            pkColumnName="GEN_KEY", 
            valueColumnName="GEN_VALUE", 
            pkColumnValue="HERO_ID", 
            allocationSize=1)
    @Id
    @GeneratedValue(strategy=TABLE, generator="heroGen")
    @Column(name = "HERO_ID")
    private Integer id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "hero")
    private Set<Enemy> defeatedEnemies;

    ...
}

Enemy.java

@Entity
@Table(name = "ENEMY")
public class Enemy {

    @TableGenerator(name="enemyGen", 
            table="ID_GEN", 
            pkColumnName="GEN_KEY", 
            valueColumnName="GEN_VALUE", 
            pkColumnValue="ENEMY_ID", 
            allocationSize=1)
    @Id
    @GeneratedValue(strategy=TABLE, generator="enemyGen")
    @Column(name="ENEMY_ID")
    private Integer id;

    @Column
    private String name;

    @Column
    private String description;

    @ManyToOne
    @JoinColumn(name = "HERO_ID")
    private Hero hero;

    ...
}

HeroRepository.java

@RestResource(path = "heroes")
public interface HeroRepository extends CrudRepository<Hero, Integer> {

}

EnemyRepository.java

@RestResource(path = "enemies")
public interface EnemyRepository extends CrudRepository<Enemy, Integer> {

}

root-context.xmlには以下が含まれます。

<jpa:repositories base-package="com.simple.simplemvc.repositories" />   

<bean id="restConfig" class="org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration"/>

web.xmlには以下が含まれます。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

<servlet>
    <servlet-name>rest-dispatcher</servlet-name>
    <servlet-class>org.springframework.data.rest.webmvc.RepositoryRestDispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>rest-dispatcher</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

何か案は?ありがとう!

4

2 に答える 2

2

既存のエンティティ間の関係を追加するには、POST を試してください

Content-Type: application/json

の上

http://localhost:8080/simplemvc/rest/enemies/3

本体付き

{"hero":"http://localhost:8080/simplemvc/rest/heroes/1"}

ヒーローに関連する新しい敵エンティティを追加するには、POST を試してください

http://localhost:8080/simplemvc/rest/enemies

本体付き

{"name":"Enemy name", "description":"Enemy description", "hero":"http://localhost:8080/simplemvc/rest/heroes/1"}

spring-data-rest-webmvc バージョン 2.2.0.RELEASE でテスト済み

于 2014-10-14T12:18:48.203 に答える
0

私がここで尋ねたのと同じ問題に直面していると思います:

Spring Data Rest、多対一

答えは、「text/uri-list」を使用していなくても、関係の多側にエンティティを追加する問題を解決します。

于 2013-11-28T11:19:23.130 に答える