使用 Spring Data Rest 时公开所有 ID

我想使用Spring Rest接口公开所有ID。

我知道默认情况下,像这样的ID不会通过rest接口公开:

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    private Long id;

我知道我可以使用它来公开以下各项的 ID:User

@Configuration
public class RepositoryConfig extends RepositoryRestMvcConfiguration {
    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(User.class);
    }
}

但是,有没有一种简单的方法来公开所有ID,而无需在此方法中手动维护列表?configureRepositoryRestConfiguration


答案 1

如果要公开所有实体类的 id 字段:

import java.util.stream.Collectors;

import javax.persistence.EntityManager;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;

@Configuration
public class MyRepositoryRestConfigurerAdapter extends RepositoryRestConfigurerAdapter {

    @Autowired
    private EntityManager entityManager;

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(e -> e.getJavaType()).collect(Collectors.toList()).toArray(new Class[0]));
    }

}

答案 2

我发现,如果您将字段命名为“”,如果您有一个公共 getter for the ,它将显示在 JSON 中。Id 将显示为名为 ' 的 JSON 密钥@IdIdIdid'

例如:@Id @Column(name="PERSON_ROLE_ID") private Long Id;

这也适用于名为“”的字段,只要它有一个公共获取器。在这种情况下,Id 的字段将显示为 JSON 对象。@EmbeddedIdId

例如:@EmbeddedId private PrimaryKey Id;

令人惊讶的是,这是区分大小写的,调用id ''不起作用,即使它是Java字段的更常规名称。id

我应该说,我完全偶然发现了这一点,所以我不知道这是否是一个公认的约定,或者是否适用于Spring Data和REST的以前或未来版本。因此,我已经包括了我的maven pom的相关部分,以防它对版本敏感......

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc7</artifactId>
        <version>12.1.0.2</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>