programing

Spring Data REST에서 JSON 응답으로 ID를 반환합니다.

subpage 2023. 7. 3. 22:53
반응형

Spring Data REST에서 JSON 응답으로 ID를 반환합니다.

나는 실체가 있습니다.

@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @Column(name = "id", unique = true, nullable = false)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

이렇게 초기화합니다.

@PostConstruct
public void init() {
    List<String> newFiles = this.listFiles();
    newFiles.forEach(filename -> {
        Book book = new Book();
        book.setName(filename);

        dbRepository.save(book);
    });
}

의 결과를 설정하면save의 예로Book나는 그것을 얻을 수 있습니다.id그리고 그것은 아닙니다.null—그래서id정상적으로 생성됩니다.

리포지토리를 정의했습니다.

@RepositoryRestResource
public interface IBooksRepository extends CrudRepository<Book, Long> {
}

데이터를 가져오고 데이터를 설정하는 데 사용하고 싶습니다.books데이터베이스에 있는 테이블.

액세스를 시도할 때repository rest사용.curl localhost:8080/books다음과 같은 답변을 받습니다.

{
   "_embedded":{
      "books":[
         {
            "name":"simple-file.txt",
            "_links":{
               "self":{
                  "href":"http://localhost:8080/books/1"
               },
               "book":{
                  "href":"http://localhost:8080/books/1"
               }
            }
         }
      ]
   },
   "_links":{
      "self":{
         "href":"http://localhost:8080/books"
      },
      "profile":{
         "href":"http://localhost:8080/profile/books"
      }
   }
}

books요소 리턴name오직. 어떻게 돌려줄 수 있습니까?id마찬가지로, 와 같은 수준에서.name?

Spring Data Rest는 기본적으로 ID를 숨깁니다. JSON에 ID를 저장하려면 엔티티에 대한 ID를 수동으로 구성해야 합니다.스프링 버전에 따라 자체 구성(이전)을 제공할 수 있습니다.

@Configuration
public class ExposeEntityIdRestConfiguration extends RepositoryRestMvcConfiguration {

    @Override
    protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Book.class);
    }
}

...또는 등록RepositoryRestConfigurer(현재):

@Component
public class ExposeEntityIdRestMvcConfiguration extends RepositoryRestConfigurerAdapter {

  @Override
  public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.exposeIdsFor(Book.class);
  }
}

자세한 내용은 Spring Data Rest 설명서를 참조하십시오.

승인된 응답이 더 이상 사용되지 않는 메서드를 재정의합니다.다음은 업데이트된 버전입니다.

@Component
public class RestConfig implements RepositoryRestConfigurer {

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
        config.exposeIdsFor(Book.class);
    }
}

대안적인 접근 방식은 다음을 구현하는 것은RepositoryRestConfigurer당신의@SpringBootApplication주석이 달린 클래스:

@SpringBootApplication
public class MyApplication implements RepositoryRestConfigurer {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) {
        config.exposeIdsFor(Book.class);
    }

}

이제 정적 메서드가 있습니다.RepositoryRestConfigurer.withConfig그것은 위와 같은 일을 합니다.javadoc 참조:

{@linkRespositoryRestConfiguration}만 수정하려는 단순한 {@linkRestConfigurer} 인스턴스를 쉽게 생성할 수 있는 편리한 방법입니다.

그들의 통합 테스트 중 하나에서 사용법을 발견했습니다.

따라서 현재로서는 다음과 같은 접근 방식이 보다 최신입니다.

@Bean
public RepositoryRestConfigurer repositoryRestConfigurer()
{
    return RepositoryRestConfigurer.withConfig(config -> {
        config.exposeIdsFor(Book.class);
    });
}
@Component
public class RestConfig implements RepositoryRestConfigurer {

    @Override
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.exposeIdsFor(Book.class);
        //config.exposeIdsFor(Library.class);
      }

}

이것은 모든 엔티티에 적용되는 솔루션입니다.

    @Autowired
    private EntityManager entityManager;
    
    @Bean
    public RepositoryRestConfigurer repositoryRestConfigurer() {
        return RepositoryRestConfigurer.withConfig(config -> config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(Type::getJavaType).toArray(Class[]::new)));
    }

이것은 좋은 방법입니다.

@Projection(name = "customBook", types = { Book.class }) 
public interface CustomBook {
 
    @Value("#{target.id}")
    long getId(); 
    
}

크레딧: https://www.baeldung.com/spring-data-rest-projections-excerpts

언급URL : https://stackoverflow.com/questions/44046659/return-ids-in-json-response-from-spring-data-rest

반응형