web-dev-qa-db-ja.com

アプリをSpringBootに移行した後にSpringData Restを使用しているときに、@ Idを持つエンティティプロパティがJSONにマーシャリングされなくなったことを確認しました

この質問はこれに関連していますSO質問( Spring boot @ResponseBodyはエンティティIDをシリアル化しません )。アプリをSpring Bootに移行して使用した後、 spring-boot-starter-data-rest依存関係では、エンティティの@Idフィールドが結果のJSONでマーシャリングされなくなりました。

これは私のリクエストマッピングであり、デバッグ中に、データを返す前にデータが変更されていないことがわかります。そのため、@ Idプロパティは後で削除されます。

@RequestMapping(method = RequestMethod.GET, produces = {"application/json"})
public PagedResources<Receipt> receipts(Pageable pageable, PagedResourcesAssembler assembler) {
    Page<Receipt> receipts = receiptRepository.findByStorerAndCreatedDateGreaterThanEqual("003845", createdStartDate, pageable);
    PagedResources<Receipt> pagedResources = assembler.toResource(receipts, receiptResourceAssembler);
    return pagedResources;
}

私のアプリではユーザーがその値で検索できるため、結果のJSONに@Idフィールドを保持できる設定はありますか?.

ありがとう:)

20
Patrick Grimard

デフォルトでは、Spring DataRestはIDを吐き出しません。ただし、 exposeIdsFor(..) メソッドを使用して選択的に有効にすることができます。あなたはこのような構成でこれを行うことができます

@Configuration
public static class RepositoryConfig extends
        RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration(
            RepositoryRestConfiguration config) {
        config.exposeIdsFor(Class1.class, Class2.class);
    }
}
24
Stackee007

Spring Data Rest 2.4(spring-boot 1.3.0.M5を使用している場合は推移的な依存関係)以降、 RepositoryRestConfigurerAdapter を使用できます。例えば、

@Configuration
class SpringDataRestConfig {

    @Bean
    public RepositoryRestConfigurer repositoryRestConfigurer() {

        return new RepositoryRestConfigurerAdapter() {
            @Override
            public void configureRepositoryRestConfiguration(
                                 RepositoryRestConfiguration config) {
                config.exposeIdsFor(Class1.class, Class2.class);
            }
        }

    }

}
20
Ryan Parrish

公開する前にIdディスカッションを読んでください: https://github.com/spring-projects/spring-hateoas/issues/66

In RESTリソースのIDはそのURIです。クライアントは明示的にIDを使用してURLを作成しません。たとえば、IDをuuidに置き換えることができます。または、URLスキームを変更することもできます。

9
GKislin

@ Idアノテーションモデルクラスで魔法を実行します。

public class Location {

    @Id
    private String woeid;
    private String locationName;

次に、mongoオブジェクトは次のようになります。

{
    "_id" : "2487889",
    "_class" : "com.agilisys.weatherdashboard.Location",
    "locationName" : "San Diego, CA"
}
0
jmojico

@ getter、@ settersを置くと、jsonの結果に公開されます。お役に立てば幸いです。

0
leon_