使用Spring Data Rest时公开所有ID

Bai*_*man 19 java rest spring spring-mvc spring-data-rest

我想使用Spring Rest接口公开所有ID.我知道默认情况下这样的ID

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

不会通过其余界面公开.

我知道我可以用它

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

公开用户的ID.

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

提前致谢!

Mar*_*ark 14

我发现,如果你命名@Id字段' Id'它将显示在JSON中,如果你有一个公共的getter Id.Id将显示为名为' id' 的JSON密钥

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

这也适用于@EmbeddedId称为' Id'的字段,只要它具有公共getter.在这种情况下,Id的字段将显示为JSON对象.

例如: @EmbeddedId private PrimaryKey Id;

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

我应该说我完全意外地发现了这一点,所以我不知道这是否是一个公认的约定,或者是否适用于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>
Run Code Online (Sandbox Code Playgroud)


mek*_*azu 13

如果要公开所有实体类的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]));
    }

}
Run Code Online (Sandbox Code Playgroud)

  • .map(EntityType::getJavaType) (4认同)

Jus*_*wis 10

目前,SDR无法做到这一点.SDR Jira跟踪器上的这个问题给出了一些解释,说明为什么不能(也许不应该)这样做.

参数基本上是因为ID已经包含在self响应中的链接中,所以您不需要将它们作为对象本身的属性公开.

也就是说,您可以使用反射来检索具有javax.persistence.Id注释然后调用的所有类RepositoryRestConfiguration#exposeIdsFor(Class<?>... domainTypes).


Jon*_*sen 9

@mekasu的更新答案。2.4 中界面RepositoryRestConfigurer发生了一些变化。

2.4 之前:

import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
import javax.persistence.EntityManager;
import javax.persistence.metamodel.Type;

@Configuration
public class Config implements RepositoryRestConfigurer {

    @Autowired
    private EntityManager entityManager;

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(Type::getJavaType).toArray(Class[]::new));
    }
}
Run Code Online (Sandbox Code Playgroud)

2.4 后

import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import javax.persistence.EntityManager;
import javax.persistence.metamodel.Type;

@Configuration
public class Config implements RepositoryRestConfigurer {

    @Autowired
    private EntityManager entityManager;

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
        config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(Type::getJavaType).toArray(Class[]::new));
    }
}
Run Code Online (Sandbox Code Playgroud)