복붙노트

[SPRING] Spring 데이터 나머지에 목록을 게시하는 방법?

SPRING

Spring 데이터 나머지에 목록을 게시하는 방법?

이 예제를 따라 가면 고유 한 Person 객체를 게시 할 수 있습니다. 한 번에 Person 컬렉션을 게시 할 수있는 REST 서비스가 필요합니다. 한 번의 호출로 수많은 Person 개체가있는 Team이라는 컬렉션 / 목록.

내 질문에, 당신이 REST 요청에 각 사람을 보내는 OneToMany 관계에 대한 정확한 질문이 아닙니다. 이 주제는 잘 대답합니다.

@RepositoryRestResource 나 Spring Data Rest의 다른 기능을 이용하여 Person 객체 컬렉션을 보내고 싶습니다. Spring Data Rest에서 가능합니까? 또는 컨트롤러를 생성하고 목록을 수신하고 각 Person을 삽입하기 위해 팀 목록을 구문 분석하여 해결해야합니까?

이 기능 요청을 발견했습니다. 요즘 봄 휴식 데이터에 내가 찾고있는 것이 누락되어 있다고 대답하는 것 같지만 확실하지 않습니다.

내 비즈니스 요구 사항에서 응용 프로그램 A는 응용 프로그램 B에 주문 목록을 게시하고 향후 처리를 위해 데이터베이스에 저장해야하므로 Spring 데이터 나머지에 대한 내용을 읽고 샘플을 만든 후 깨끗한 아키텍처가 훌륭하고 매우 적합하다는 것을 알았습니다 내가 목록을 게시하는 방법을 찾지 못했다는 사실을 제외하고는 나의 요구 사항에 대해.

해결법

  1. ==============================

    1.글쎄, AFAIK 당신은 봄 데이터 휴식과 그것을 할 수 없어, 그냥 문서를 읽고 당신이 볼 수있는 컬렉션 리소스에 목록을 게시에 대한 언급이 없습니다.

    글쎄, AFAIK 당신은 봄 데이터 휴식과 그것을 할 수 없어, 그냥 문서를 읽고 당신이 볼 수있는 컬렉션 리소스에 목록을 게시에 대한 언급이 없습니다.

    그 이유는 내게 불분명하지만, REST 자체는 일괄 작업을 수행하는 방법을 구체적으로 지정하지 않습니다. 따라서 컬렉션 리소스에 대한 목록을 게시해야하는 것처럼이 기능에 어떻게 접근해야하는지 명확하지 않습니다. 또는 / someentity / batch와 같은 리소스를 내보내 패치, 제거 및 엔티티를 한 번에 추가 할 수 있습니까? 어떻게 목록을 추가 할 것인가? 콜렉션에 대한 단일 POST의 경우 location 헤더의 spring-data-rest 리턴 ID. 배치 추가의 경우이 작업을 수행 할 수 없습니다.

    그렇다고해서 스프링 데이터가 나머지 일괄 처리 작업이 누락 된 것을 정당화하지는 못합니다. 그들은이 IMHO를 구현해야하지만, 적어도 그것이 누락 된 이유를 이해하는 데 도움이 될 수 있습니다.

    내가 말할 수있는 것은 비록 당신이 / someentity / batch를 제대로 처리 할 수있는 프로젝트에 자신 만의 Controller를 추가 할 수 있으며, 다른 프로젝트에서 사용할 수 있도록 라이브러리를 만들 수도 있습니다. 또는 spring-data-rest를 fork하고이 기능을 추가하십시오. 나는 그것이 어떻게 작동하고 지금까지 실패했는지 이해하려고 노력했지만. 하지만 아마 그걸 모두 알지?

    이에 대한 기능 요청이 있습니다.

  2. ==============================

    2.user1685095 대답을 기반으로 사용자 정의 Controller PersonRestController를 만들 수 있으며 Person의 포스트 콜렉션을 노출 할 수 있습니다. 아직 봄 날 휴식으로 노출되지 않은 것 같습니다.

    user1685095 대답을 기반으로 사용자 정의 Controller PersonRestController를 만들 수 있으며 Person의 포스트 콜렉션을 노출 할 수 있습니다. 아직 봄 날 휴식으로 노출되지 않은 것 같습니다.

    @RepositoryRestController
    @RequestMapping(value = "/persons")
    public class PersonRestController {
    private final PersonRepository repo;
    @Autowired
    public AppointmentRestController(PersonRepository repo) {
        this.repo = repo;
    }
    
    @RequestMapping(method = RequestMethod.POST, value = "/batch", consumes = "application/json", produces = "application/json")
    public @ResponseBody ResponseEntity<?> savePersonList(@RequestBody Resource<PersonWrapper<Person>> personWrapper,
            PersistentEntityResourceAssembler assembler) {
        Resources<Person> resources = new Resources<Person>(repo.save(personWrapper.getContent()));
        //TODO add extra links `assembler`
        return ResponseEntity.ok(resources);
    }
    

    }

    최신 정보

    public class PersonWrapper{
     private List<Person> content;
    
    public List<Person> getContent(){
    return content;
    }
    
    public void setContent(List<Person> content){
    this.content = content;
    }
    }
    
    public class Person{
    private String name;
    private String email;
    // Other fields
    
    // GETTER & SETTER 
    }
    
  3. ==============================

    3.@RequestBody List >를 사용하려고했습니다. 요청 본문에 링크가 없으면 제대로 작동하지만 요소가 링크를 전달하면 서버는 요청 본문을 비 직렬화 할 수 없습니다.

    @RequestBody List >를 사용하려고했습니다. 요청 본문에 링크가 없으면 제대로 작동하지만 요소가 링크를 전달하면 서버는 요청 본문을 비 직렬화 할 수 없습니다.

    그런 다음 @RequestBody Resources 를 사용하려고 시도했지만 목록의 기본 이름을 파악할 수 없었습니다.

    마지막으로, List >가 포함 된 래퍼를 시도해 보았습니다.

    여기 내 해결책은 다음과 같습니다.

    먼저 List >에 대한 래퍼 클래스를 만듭니다.

    public class Bulk<T> {
        private List<Resource<T>> bulk;
        // getter and setter
    }
    

    그런 다음 @RequestBody Resource >를 매개 변수로 사용하십시오.

    마지막으로, 한 요청에서 대량 데이터를 만들기위한 링크가있는 json 예제 :

    {
        "bulk": [
            {
                "title": "Spring in Action",
                "author": "http://localhost:8080/authors/1"
            },
            {
                "title": "Spring Quick Start",
                "author": "http://localhost:8080/authors/2"
            }
        ]
    }
    
  4. ==============================

    4.

    @RequestMapping(method=RequestMethod.POST, value="/batchInsert", consumes = "application/json", produces = "application/json")
    @ResponseBody
    public ResponseEntity<?> batchInsert(@RequestBody Resources<Person> people, PersistentEntityResourceAssembler assembler) throws Exception {
        Iterable<Person> s = repo.save( people.getContent() ); // save entities
    
        List<PersistentEntityResource> list = new ArrayList<PersistentEntityResource>();
        Iterator<Sample> itr = s.iterator();
        while(itr.hasNext()) {
            list.add( assembler.toFullResource( itr.next() ) );
        }
    
        return ResponseEntity.ok( new Resources<PersistentEntityResource>(list) );
    }
    
  5. from https://stackoverflow.com/questions/31374689/how-to-post-a-list-to-spring-data-rest by cc-by-sa and MIT license